linux筆記(28)sed和awk的聯系及拓展
把/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]# 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拓展
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的聯系及拓展