grep、sed

正則

  • 正則就是一串有規律的字符串,掌握好正則對於編寫shell腳本有很大幫助,各類編程語言中都有正則,原理是同樣的
  • 正則三劍客
    • grep
    • sed
    • awk

grep

  • grep用法
  • grep [-cinvABC] 'word' filename
    • -c 行數
    • -i 不區分大小寫
    • -n 顯示行號
    • -v 取反
    • -r 遍歷全部子目錄
    • -A 後面跟數字,過濾出符合要求的行以及下面n行
    • -B 同上,過濾出符合要求的行以及上面n行
    • -C 同上,同時過濾出符合要求的行以及上下各n行
  • 輸出結果:
[root@test01 jiaoben]# grep -n 'root' 1.log
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@test01 jiaoben]# grep -nv 'nologin' 1.log 
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
  • 輸出結果:
[root@test01 jiaoben]# grep -nv '[0-9]' 1.log 
[root@test01 jiaoben]# grep -nv '[1,2]' 1.log 
1:root:x:0:0:root:/root:/bin/bash
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
13:nobody:x:99:99:Nobody:/:/sbin/nologin
16:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:ntp:x:38:38::/etc/ntp:/sbin/nologin
23:nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
  • 輸出結果
[root@test01 jiaoben]# grep -v '^#' 2.log|grep -v  '^$'
asdfadfafasdfas
dfadffffffffffff#
[root@test01 jiaoben]# egrep -v '^#|^$' 2.log
asdfadfafasdfas
dfadffffffffffff#
- 能夠看到grep -v '^#' 2.log|grep -v  '^$'就等於egrep -v '^#|^$' 2.log
  • 輸出結果
[root@test01 jiaoben]# grep '^[a-zA-Z]' 2.log
asdfadfafasdfas
dfadffffffffffff#
[root@test01 jiaoben]# grep '^[^a-zA-Z]' 2.log
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
- ^ x: 表示已x開頭的行。^[a-zA-Z]表示已任意字母開頭的行。
- . 表示任意一個字符
- * 表示任意個數的字符,或者任意字符
- .*是通配,表示任意字符。
- grep 'o\{2\}' /etc/passwd== egrep 'o{2}' /etc/passwd 使用grep,當出現函數時須要脫義,寫法較繁瑣,能夠使用egrep來替代。
- + 表示有1個以上前面的字符
- ?表示有任意個?前面的字符
- '(oo){2}'這個寫法,匹配的是2個oo 也就是oooo.
-  'root|nologin'這個寫法是表示匹配root或者匹配nologin的行。

sed

  • sed:stream editor文本流編輯,sed是一個非交互式的面向字符流的編輯器。能同時處理多個文件多行的內容,能夠不修改源文件,只將匹配的文件內容輸出到屏幕上。還能夠對文件作修改。

sed的命令語法格式:

  • sed的命令格式: sed [option] 'sed command'filename
  • sed的腳本格式:sed [option] -f 'sed script'filename

sed經常使用的參數

  • -n:將匹配的行輸出到屏幕上。
  • -e:能夠使用這個參數來增長匹配條件。
  • -r:支持擴展表達式
  • -i:將內容直接寫入文件(修改文件內容)。

實例:

  • -n選項
    [root@test01 jiaoben]# sed -n '5'p 1.log           ##第5行內容輸出到屏幕
    	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    	[root@test01 jiaoben]# sed -n '1,5'p 1.log   ##將1-5行內容輸出到屏幕
    	root:x:0:0:root:/root:/bin/bash
    	bin:x:1:1:bin:/bin:/sbin/nologin
    	daemon:x:2:2:daemon:/sbin:/sbin/nologin
    	adm:x:3:4:adm:/var/adm:/sbin/nologin
    	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    	[root@test01 jiaoben]#  sed -n '22,$'p 1.log    ##將20行到尾行內容輸出到屏幕
    	nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    	nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
    	mysql:x:1000:1000::/home/mysql:/sbin/nologin
    	[root@test01 jiaoben]# sed -n '/root/'p 1.log 	##將含有root的行輸出到屏幕 
    	root:x:0:0:root:/root:/bin/bash
    	operator:x:11:0:operator:/root:/sbin/nologin
    	[root@test01 jiaoben]# sed -n '/^root/'p 1.log  ##將以root開頭的行輸出到屏幕
    	root:x:0:0:root:/root:/bin/bash
    	[root@test01 jiaoben]# sed -n '/var\/lib\/nginx:\/sbin\/nologin$/'p 1.log
    	nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
    	## 將以var/lib/nginx:/sbin/nologin結尾的行輸出到屏幕,這裏用到了脫義符號\,若是不脫義就會報錯。
    	[root@test01 jiaoben]# sed -n '/r..o/'p 1.log ##匹配ro之間有兩個任意字符的行,輸出到屏幕
    	operator:x:11:0:operator:/root:/sbin/nologin  # 這一行中operator,r和o之間有at,匹配成功
    	polkitd:x:999:998:User for polkitd:/:/sbin/nologin #這一行中有for polkitd ,r和o之間有空格和p,匹配成功
  • -e選項
    [root@test01 jiaoben]# sed -e '1'p -e '/1000/'p -n 1.log ##將第一行和含有1000字符的行輸出到屏幕。
    	root:x:0:0:root:/root:/bin/bash
    	mysql:x:1000:1000::/home/mysql:/sbin/nologin
  • -d選項
    [root@test01 jiaoben]# sed '1,22'd 1.log ##刪除1-22行 (不會修改文件,只是輸出結果不顯示1-22行)
    	nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
    	mysql:x:1000:1000::/home/mysql:/sbin/nologin
    	[root@test01 jiaoben]# sed '/oot/'d 1.log  ##刪除匹配oot字符的行(不會修改文件)
    	bin:x:1:1:bin:/bin:/sbin/nologin
    	daemon:x:2:2:daemon:/sbin:/sbin/nologin
    	adm:x:3:4:adm:/var/adm:/sbin/nologin
    	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • 替換功能
    [root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed '1,2s/ot/to/g' 1.log  ##將第一行第二行內容中的to字符改成ot字符
    	roto:x:0:0:roto:/roto:/bin/bash
    	bin:x:1:1:bin:/bin:/sbin/nologin
    	daemon:x:2:2:daemon:/sbin:/sbin/nologin
    	[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed 's#ot#to#g' 1.log ## 這個寫法就是用#代替了/。
    	roto:x:0:0:roto:/roto:/bin/bash
    	[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed 's/[0-9]//g' 1.log ##將數字都刪掉
    	root:x:::root:/root:/bin/bash
    	bin:x:::bin:/bin:/sbin/nologin
    	daemon:x:::daemon:/sbin:/sbin/nologin
    	[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed 's/[a-zA-Z]//g' 1.log ##將字母都刪掉
    	::0:0::/://
    	::1:1::/://
    	::2:2::/://
    	[root[@test01](https://my.oschina.net/u/2453422) jiaoben]# sed -r 's/(root)(.*)(bash)/\3\2\1/' 1.log 
    	bash:x:0:0:root:/root:/bin/root ##將每行的第一段和第三段調換位置
相關文章
相關標籤/搜索