1. 程式人生 > >linux筆記(28)sed和awk的聯系及拓展

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

28

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拓展

  1. 如何截取文件中特定的某到某行

[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]# cat test.txt

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

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


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

[root@localhost sed]# cat test.txt

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

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

fff

[abcfd]

fgfgf

支持多字符:

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

ert

123


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


把/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




用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拓展

  1. 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

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