天天看點

linux筆記(28)sed和awk的聯系及拓展

sed練習題

把/etc/passwd 複制到/root/test.txt,用sed列印所有行

[root@localhost sed]# sed -n '1,$p' passwd

列印test.txt的3到10行

[root@localhost sed]# sed -n '3,10'p passwd 

列印test.txt 中包含 ‘root’ 的行

[root@localhost sed]# sed -n '/root/'p passwd 

删除test.txt 的15行以及以後所有行

[root@localhost sed]# sed '15,$'d passwd

删除test.txt中包含 ‘bash’ 的行

[root@localhost sed]# sed '/bash/'d passwd 

替換test.txt 中 ‘root’ 為 ‘toor’

[root@localhost sed]# sed 's/root/toor/g' passwd

替換test.txt中 ‘/sbin/nologin’ 為 ‘/bin/login’

[root@localhost sed]# sed 's#sbin/nologin#bin/login#g' passwd 

删除test.txt中5到10行中所有的數字

[root@localhost sed]# sed '5,10s/[0-9]//g' passwd 

删除test.txt 中所有特殊字元(除了數字以及大小寫字母)

[root@localhost sed]# sed 's/[^a-zA-Z0-9]//g' passwd 

把test.txt中第一個單詞和最後一個單詞調換位置

root@localhost sed]# sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' passwd bash:x:0:0:root:/root:/bin/root-zA-Z]*$\)/\4\2\3\1/' passwd 

把test.txt中出現的第一個數字和最後一個單詞替換位置

[root@localhost sed]#  sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' passwd 

把test.txt 中第一個數字移動到行末尾

[root@localhost sed]#  sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd

在test.txt 20行到末行最前面加 ‘aaa:’

[root@localhost sed]# sed '20,$s/^.*$/aaa:&/' passwd 

sed拓展

如何截取檔案中特定的某到某行

[root@localhost sed]# cat test.txt 

ert

fff

**

[abcfd]

123

324

444

[rty]

fgfgf

如何截取[abcfd]到[rty]這一段呢?

答案:[root@localhost sed]# sed -n '/\[abcfd\]/,/\[rty\]/p' test.txt

2.sed如何轉換大小寫字母

(1)把所有的小寫變大寫

[root@localhost sed]# sed 's/[a-z]/\u&/g' test.txt 

(2)把所有的大寫變小寫

[root@localhost sed]# sed 's/[a-z]/\l&/g' test.txt

(3)把每個單詞的第一個小寫字母變大寫

[root@localhost sed]# sed 's/\b[a-z]/\u&/g' test.txt  

3.sed在檔案某一行最後一個數字

[root@localhost sed]# sed 's/\(^[0-9].*\)/\1 12/' test.txt 

4.如何使用sed列印1到100行包含某個字元串的行

答案:[root@localhost sed]# sed -n '1,100{/fd/p}' test.txt

支援多字元:

[root@localhost sed]# sed -n '1,100{/ert/p;/1./p}' test.txt 

5.sed删除某關鍵字的下一行到最後一行

awk練習題

用awk 列印整個test.txt (以下操作都是用awk工具實作,針對test.txt)

[root@localhost sed]# awk '{print $0}' passwd 

查找所有包含 ‘bash’ 的行

[root@localhost sed]# awk '/bash/' passwd

用 ‘:’ 作為分隔符,查找第三段等于0的行

[root@localhost sed]# awk -F ':' '$3==0' passwd

用 ‘:’ 作為分隔符,查找第一段為 ‘root’ 的行,并把該段的 ‘root’ 換成 ‘toor’ (可以連同sed一起使用)

[root@localhost sed]# awk -F ':' '$1==root' |sed 's/root/toor/g' passwd 

用 ‘:’ 作為分隔符,列印最後一段

[root@localhost sed]# awk -F ':' '{print $NF}' passwd 

列印行數大于20的所有行

[root@localhost sed]# awk  'NR>20' passwd

用 ‘:’ 作為分隔符,列印所有第三段小于第四段的行

[root@localhost sed]# awk -F ':' '$3<$4' passwd

用 ‘:’ 作為分隔符,列印第一段以及最後一段,并且中間用 ‘@’ 連接配接 (例如,第一行應該是這樣的形式 'root@/bin/bash‘ )

[root@localhost sed]# awk -F ':'  {'print $1"@"$NF}' passwd

用 ‘:’ 作為分隔符,把整個文檔的第四段相加,求和

[root@localhost sed]# awk -F ':' '{(tot=tot+$4)}; END {print tot}' passwd 

awk拓展

awk中gsub函數的使用

awk 'gsub(/www/,"abc")' /etc/passwd                                    // passwd檔案中把所有www替換為abc

2.把檔案中相同的行合并成一行

paste  filename1  filename2

cat  a.txt

1 2 3 

4 5 6 

a b c

cat b.txt

3 2 1 

6 5 4 

c b a 

則  paste  a.txt  b.txt  結果為

1 2 3   3 2 1

4 5 6   6 5 4

a b c   c b a

如果,你想在兩個檔案連接配接處用一個指定的字元連接配接,還可以用-d來指定

paste -d '+'  a.txt b.txt

結果為

1 2 3+3 2 1

4 5 6+6 5 4

a b c+c b a

awk更詳細的用法:http://www.cnblogs.com/emanlee/p/3327576.html

本文轉自 小新銳 51CTO部落格,原文連結:http://blog.51cto.com/13407306/2044240,如需轉載請自行聯系原作者

繼續閱讀