Linux_note 命令grep,sed,awk

1、grep 過濾出指定的行

grep  [-cinvABC]  'word'  filename

--color 把匹配到的關鍵詞用紅色標識 如:# grep --color 'root' /etc/passwd


-c :打印符合要求的行數


-i :忽略大小寫


-n :在輸出符合要求的行的同時連同行號一起輸出


-v :打印不符合要求的行# cg -v 'root' 1.txt


-A :後跟一個數字(有無空格都可以),例如 朅2則表示打印符合要求的行以及下面兩行

# cg -A 2 -n 'root' 1.txt

-B :後跟一個數字,例如 B 2 則表示打印符合要求的行以及上面兩行# cg -B 2 -n 'root' 1.txt


-C :後跟一個數字,例如 C 2 則表示打印符合要求的行以及上下各兩行# cg -C 2 -n 'root' 1.txt

-r :將目錄下所有文件全部遍歷 # cg -r 'iptables' /etc/*  或# cg -rh 'iptables' /etc/*

[root@zekLinux ~]# alias cg='grep --color'

[root@zekLinux ~]# cg -n 'root' 1.txt

1:root:x:0:0:root:/root:/bin/bash

11:operator:x:11:0:operator:/root:/sbin/nologin

[root@zekLinux ~]# cg -c 'root' 1.txt

2

[root@zekLinux ~]# cg -A 2 -n 'root' 1.txt

1:root:x:0:0:root:/root:/bin/bash

 grep sed 都是支持 {1,3}這樣的匹配規則的,表示重複前面字符1到3次。但是awk屬於一個比較複雜的腳本語


言,在它裏面()和{}都是有特殊含義的,所以我們要使用這些符號時,需要給他們脫義,你可能會想到使用\脫


義,但是不管用。有一個方法就是加上--posix選項就ok ,比如

awk --posix -F ':' '$1 ~ /(ab)+|o{1,3}/' 1.txt

這樣就可以把B選項匹配出來

2-bin:x:1:1:bin:/bin:/sbin/nologin

3-daemon:x:2:2:daemon:/sbin:/sbin/nologin

--

11:operator:x:11:0:operator:/root:/sbin/nologin

12-games:x:12:100:games:/usr/games:/sbin/nologin

13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

[root@zekLinux ~]# cg -B 2 -n 'games' 1.txt

10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

11-operator:x:11:0:operator:/root:/sbin/nologin

12:games:x:12:100:games:/usr/games:/sbin/nologinli


例子:

過濾出帶有某個關鍵詞的行並輸出行號

# cg -n 'aming' 1.txt 或者grep -n --color 'aming' 1.txt   cg= 'grep --color '

過濾出帶有某個關鍵詞的行並輸出行號

# cg -v -n  'nologin' 1.txt

過濾出所有包含數字的行

#cg -n '[0-9]' 1.txt

過濾出包含某個字母的行並輸出行號

# cg -n '[aN]' 1.txt

#cg -n -i '[aN]' 1.txt

過濾出不包含字母的行並輸出行號

[root@zekLinux ~]# grep --color  -n -v '[a-zA-Z]' 1.txt

22:$%$#%@^&&*()^%#!@#%^&*((*&^%$#@!%((*&^%$#@@***&^%

23:

33:34988385983402474023572647346348324623768329

去除以字母開頭的行

[root@zekLinux ~]# cg -n -v '^[a-zA-Z]' 1.txt

22:$%$#%@^&&*()^%#!@#%^&*((*&^%$#@!%((*&^%$#@@***&^%

23:

33:34988385983402474023572647346348324623768329

過濾出不以數字開頭的行

#cg -n '^[^0-9]' 1.txt

匹配出不包含數字的行

#cg -n '[^0-9]' 1.txt

去除空行

[root@zekLinux ~]# grep -v '^$' 1.txt

過濾任意一個或多個字符

#cg 'r.o' 1.txt

# cg 'r*o' 1.txt

#cg 'r*o' 1.txt 匹配出r開頭o結尾的字符,中間是什麼不重要,也叫貪婪匹配。

 . 表示任意一個字符

 * 表示零個或多個前面的字符

.* 表示零個或多個任意字符,空行也包含在內

grep 'r\?o' passwd 表示匹配零個或一個前面爲“r”的字符。

grep 'r.*o' passwd 表示r開頭o結尾,中間零個或多個任意字符

grep 'r*o' passwd 匹配匹配零個或多個前面的字符。這個前面的字符是“r”,可以是0個r或者多個r

grep '^[1-9][0-9]*$' 1.txt:匹配開頭爲1到9其中一個數字,結尾是0個或多個數字


過濾出以特殊符號開頭的行

[root@zekLinux ~]# cg -n '^[^0-9a-zA-Z]' 1.txt

22:$%$#%@^&&*()^%#!@#%^&*((*&^%$#@!%((*&^%$#@@***&^%


egrep ==grep -E egrep時grep的擴展形式 egrep能用的grep全都能用

grep --color  'r\?o' 1.txt==grep --color -E 'r?o' 1.txt==egrep --color 'r?o' 1.txt

匹配1個和1個以上+前面的字符

# egrep --color 'r+o' 1.txt

總結:. 任意一個字符;* 零個或多個*前面的字符; .* 任意個任意字符; ? 0或1個?前面的字符;+ 1或多


個+前面的字符。

匹配root或nologin

#egrep --color 'root|nologin' 1.txt

匹配root和nologin

# grep --color 'root' 1.txt |grep --color 'nologin'

用括號表示一個整體

#egrep --color '(rr)' 1.txt

匹配1個或多個rr

#egrep --color '(rr)+' 1.txt

指定匹配字符次數範圍

# egrep --color '(rr){1,3} 1.txt

? + () {} | 符號要用egrep。


2、sed

打印指定的行

# sed -n '10'p 1.txt

打印指定範圍,如20行到末

# sed -n '20,$'p 1.txt

打印包含某個字符串的行

# sed -n '/root/'p 1.txt

可以使用^ . * $ + ? 等特殊符號

# sed -n '/r.o/'p 1.txt

# sed -n '/r*o/'p 1.txt

# sed -n '/r.*o/'p 1.txt

# sed -n '/r\?o/'p 1.txt

# sed -n '/r\+o/'p 1.txt

# sed -n '/root\|nologin/'p 1.txt

# sed -n '/\(oo\)\+/'p 1.txt

-r不需要脫意符號

# sed -n -r '/(oo)+/'p 1.txt

# sed -n -r '/[^0-9]/'p 1.txt

# sed -n -r '/[^a-zA-Z]/'p 1.txt

空行

# sed -n -r '/^$/'p 1.txt

刪除空行

# sed '/^$/'d 1.txt

刪除包含數字的行

# sed '/[0-9]/'d 1.txt

刪除包含字母的行

# sed '/[a-zA-Z]/'d 1.txt

刪除指定行,如刪除1-19行

# sed '/1,19/'d 1.txt

上述刪除並沒有直接刪除文件內容只是在顯示器上不顯示。sed -i 選項就會將文件內容刪除

[root@zekLinux ~]# wc -l 2.txt

33 2.txt

[root@zekLinux ~]# sed -i '1,19'd 2.txt

[root@zekLinux ~]# wc -l 2.txt

14 2.txt


替換功能

# sed '1,10s/nologin/login/g' 1.txt

含有特殊符號需脫意\ 如:# sed '1,10s/\/sbin\/nologin/login/g' 2.txt也可以替換爲

# sed'1,10s@/sbin/nologin@logi@g' 2.txt

替換一整行

# sed '1,5s#^.*$#login#g' 2.txt

在尾部加上某字符串,如login

# sed '1,5s#^.*$#& login#g' 2.txt

將每行的數字刪除

# sed 's#[0-9]##g' 2.txt

將除字母數字之外的字符刪除

# sed 's#[^0-9a-zA-Z]##g' 2.txt

將每一行的第一段與最後一段交換

# sed -r 's#^([a-z]+)(:.*:)(.*$)#\3\2\1#g' 2.txt

# sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/' /etc/passwd

理解:sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/' /etc/passwd // 匹配第一段除":"的任意字符 匹配第二段


":任意字符: "第三段 也是除開":"的任意字符 \3\2\1 相當於把第一段和第三段對調

第一個字符與最後一個字符交換

sed -r 's/^(.)(.*)(.)$/\3\2\1/'

[root@zekLinux ~]# echo "abcdef"|sed -r 's/^(.)(.*)(.)$/\3\2\1/'

fbcdea


同時進行多個任務; -e

# sed -n '/root/p;/aming/'p 1.txt或者# sed -n -e '/root/p' -e '/aming/p' 1.txt

;特殊性若遇到一行既有root又有aming會打印兩行,不同於|,|或只打印一行,;的意思是匹配到就打印。

[root@zekLinux ~]# sed -n -r '/root|aming/'p 1.txt

root: aming x:0:0:root:/root:/bin/bash

operatorrrrro:x:11:0:operator:/root:/sbin/nologin

aming123:x:501:513::/home/aming123:/bin/bash

[root@zekLinux ~]# sed -n '/root/p; /aming/p' 1.txt

root: aming x:0:0:root:/root:/bin/bash

root: aming x:0:0:root:/root:/bin/bash

operatorrrrro:x:11:0:operator:/root:/sbin/nologin

aming123:x:501:513::/home/aming123:/bin/bash


3、awk 命令 截取文段中的某段

-F 指定分隔符號爲: 若分隔符號爲特殊符號則用單引號' '

打印某段字符

# awk -F ':' '{print $3}' 1.txt

# awk -F ':' '{print $3,$4}' 1.txt

顯示指定字符

# awk -F ':' 'OFS=":" {print $3,$4}' 1.txt

# awk -F ':' 'OFS="#" {print $3,$4}' 1.txt

匹配字符或字符串

# awk '/r/' 1.txt

# awk '/root|user/' 1.txt

 awk '/r*o/' 1.txt

# awk '/r?o/' 1.txt 

# awk '/r+o/' 1.txt

# awk '/r.*o/' 1.txt

匹配一個整體

# awk '/(oo)/' 1.txt

# awk '/(oooo)+/' 1.txt

按段匹配

# awk -F ':' '$1~/r*o/' 1.txt

# awk -F ':' '$1~/r*o/ {print $4}' 1.txt

多次匹配

# awk -F ':' '$1~/r*o/ {print $1,$3}; $1~/user/ {print $1,$3}' 1.txt

若匹配時匹配要求同時滿足時將打印兩次(awk屬於流式編輯器)

[root@zekLinux ~]# awk -F ':' '$1~/r*o/ {print $1,$4};$1~/nobody/ {print $1,$4}' 1.txt

rooooooooot 0

daemon 2

shutdown 0

operator 0

gopher 30

nobody 99

nobody 99

postfix 89

avahi-autoipd 170

haldaemon 68

[root@zekLinux ~]# awk -F ':' '$1~/r*o|nobody/ {print $1,$4}' 1.txt

rooooooooot 0

daemon 2

shutdown 0

operator 0

gopher 30

nobody 99

postfix 89

avahi-autoipd 170

haldaemon 68


awk 條件操作符 ==,>,<,>=,!=;<=

#  awk -F ':' '$1=="nobody"' 1.txt

nobody:x:99:99:Nobody:/:/sbin/nologin

# awk -F ':' '$1=="nobody"|| $1~/nolog/' 1.txt

# awk -F ':' '$4>=500' 1.txt

# awk -F ':' '$7!="/sbin/nologin"' 1.txt

匹配

# awk -F ':' '$7~/nolog/' 1.txt

# awk -F ':' '$7!~/nolog/' 1.txt

比較

# awk -F ':' '$3<$4' 1.txt

# awk -F ':' 'OFS=":";$3=$4' 1.txt 

# awk -F ':' '$3==$4' 1.txt

# awk -F ':' 'OFS=":";{if($4>5){$7=$3+$4}}' 1.txt

以空白字符爲分隔符,把第一段等於'aming'並且第3段小於100的行過濾出來。(首先得有以空白字符爲分隔符


的文件)

[root@zekLinux ~]# sed -i 's/:/ /g' 2.txt

[root@zekLinux ~]# awk '$1=="games" && $3<100' 2.txt

games x 12 100 games /usr/games /sbin/nologin


awk 內置變量 NF(段數) NR(行數)

# awk -F ':' 'NR==10' 1.txt 打印第十行

# awk -F ':' 'NR>10' 1.txt 打印10行以後的行

# awk -F ':' 'NR<10' 1.txt 

[root@zekLinux ~]# awk -F ':' 'NR==10 {print $1,$7}' 1.txt

uucp /sbin/nologin

[root@zekLinux ~]# awk -F ':' 'OFS=":"{if (NR==10) print $1,$7}' 1.txt

uucp:/sbin/nologin

[root@zekLinux ~]# awk -F':' '{print NF}' 1.txt

[root@zekLinux ~]# awk -F':' '{if (NF==7) print $1}' 1.txt

# awk -F':' '{print $NR,$NF}' 

NR是根據行在變化的,而NF就是這一行一共有多少段。

# awk -F ':' 'NR==10 {OFS="#";print $1,$7}' 1.txt

awk也可以經行數學運算

[root@zekLinux ~]# awk -F':' '$7=$3+$4' 1.txt

bin x 1 1 bin /bin 2

daemon x 2 2 daemon /sbin 4

adm x 3 4 adm /var/adm 7

lp x 4 7 lp /var/spool/lpd 11

sync x 5 0 sync /sbin 5

shutdown x 6 0 shutdown /sbin 6

halt x 7 0 halt /sbin 7

默認以空白符以分割符,若一個文本文檔某一段發生了改變打印時就會默認以空白符爲分隔符。需要用OFS來指


定分隔符。

[root@zekLinux ~]# awk -F':' 'OFS=":" {$7=$3+$4; print $0}' 1.txt

rooooooooot:x:0:0:root:/root:0

bin:x:1:1:bin:/bin:2

daemon:x:2:2:daemon:/sbin:4

adm:x:3:4:adm:/var/adm:7

lp:x:4:7:lp:/var/spool/lpd:11

sync:x:5:0:sync:/sbin:5

# awk -F':' 'OFS=":" {$7=$3+$4; print $1,$3}' 1.txt

計算某一段的總和,如第三段$3

[root@zekLinux ~]# awk -F':' '{sum=sum+$3};END {print sum}' 1.txt

4807

[root@zekLinux ~]# awk -F':' '{(sum=sum+$3)};END {print sum}' 1.txt

4807


{}

awk結構: awk -F ':' 'BEGIN{OFS=“:”} {if(條件){語句1;語句2;語句3}} END{語句}'

參考教程 http://www.cnblogs.com/emanlee/p/3327576.html











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章