9.4/9.5 sed
9.6/9.7 awkhtml
如下內容爲擴展部分,先挑着能看懂的練習練習。
打印某行到某行之間的內容http://ask.apelearn.com/question/559
sed轉換大小寫 http://ask.apelearn.com/question/7758
sed在某一行最後添加一個數字http://ask.apelearn.com/question/288
刪除某行到最後一行 http://ask.apelearn.com/question/213
打印1到100行含某個字符串的行 http://ask.apelearn.com/question/1048
awk 中使用外部shell變量http://ask.apelearn.com/question/199
awk 合併一個文件 http://ask.apelearn.com/question/493
把一個文件多行鏈接成一行 http://ask.apelearn.com/question/266
awk中gsub函數的使用 http://ask.apelearn.com/question/200
awk 截取指定多個域爲一行 http://ask.apelearn.com/question/224
過濾兩個或多個關鍵詞 http://ask.apelearn.com/question/198
用awk生成如下結構文件 http://ask.apelearn.com/question/5494
awk用print打印單引號 http://ask.apelearn.com/question/1738
合併兩個文件 http://ask.apelearn.com/question/945
awk的BEGIN和END http://blog.51cto.com/151wqooo/1309851
awk的參考教程 http://www.cnblogs.com/emanlee/p/3327576.html
正則表達式
awk 語法結構
awk -F ':' 'BEGIN{語句}{if(條件){語句1;語句2;語句3}} END{語句}' filename
if能夠省略shell
打印某行到某行之間的內容bash
sed -n '/root/,/user1/p' test.txt root開頭user1結尾的
把每一個單詞的第一個小寫字母變大寫 \b 函數
sed 's/\b[a-z]/\u&/g' test.txt
把每一個單詞的最後一個小寫字母變大寫spa
sed 's/[a-z]\b/\u&/g' test.txt
全部小寫變大寫.net
sed 's/[a-z]/\u&/g' test.txt
大寫變小寫:3d
sed 's/[A-Z]/\l&/g' filename
sed 在以a開頭的行尾加數字12 htm
sed -r 's/(^a.*)/\1 12/' test.txt
打印1到100行含abc字符串的行 , -n 打印出符合條件的行blog
sed -n '1,100{/abc/p}' test.txt
awk中使用變量要用-v 和awk 中使用外部shell變量
awk -F ':' -v n1=$n '{print $n1}' test.txt a=2; echo "a:b:c:d"|awk -F ":" -v get_a=$a '{print $get_a}'
合併一個文件
awk 'NR==FNR {a[$1]=$2} NR>FNR {print $0,a[$a]}' paste 1.txt 2.txt 左邊和右邊文件合併
過濾兩個或多個關鍵詞
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行 egrep '123|abc' filename //用egrep一樣能夠實現 awk '/123|abc/' filename // awk 的實現方式
使用變量
v="mail"
sed -n "/$v/p" test.txt
把一個文件多行鏈接成一行
1.b=`cat 1.txt`
echo $b
2.awk '{printf("%s ",$0)}' 1.txt
3.cat 1.txt |xargs
awk中的gsub函數的使用
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把全部www替換爲abc awk -F ':' 'gsub(/www/,"abc",$1){print $0}' /etc/passwd 替換$1中的www爲abc
awk 截取指定多個域爲一行
用awk指定分隔符把文本分爲若干段。如何把相同段的內容弄到一行
awk -F ':' '{print $1}' 1.txt |xargs
awk用print打印單引號
awk 'BEGIN{print "a'"'"'s"}'
awk 'BEGIN{print "a'\''s"}'
awk 'BEGIN{print "a\"s"}'
sed 替換、及替換指定的字符
p 打印
d 刪除
命令格式:sed -n 'n' p filename,單引號內的n是一數字,表示第幾行
sed -n '/root/'p test.txt -n 只打印出帶有root的行
而且在grep中可使用的特殊字符均可以在sed中使用(^,$,*,{},| 等)
sed -n '/r\+o/'p test.txt 使用+號 須要用\脫義
sed -nr '/r+o/'p test.txt 不脫義使用 -r
sed -n '2'p test.txt 指定第2行打印
sed -n '2,5'p test.txt 打印2-5行
sed -n '5,$'p test.txt 打印第5行到後面的行,$表示末行
sed -n '1,$'p test.txt 打印第一行到最後的全部行
sed -e '1'p -e '/bus/'p -n test.txt -e 能夠實現多個行爲,查找第一行,並把文檔中含有bus的顯示出來
sed -e '1'p -e '/root/'p -n test.txt 匹配第一行 會顯示一邊,第二個也匹配,也會打印出來,會打印兩次
sed -n '/bus/'Ip test.tx 使用I (大寫字母i),大小寫都顯示
sed '30,$'d test.txt 刪除第30行和後面全部的行,顯示剩餘的行數,使用d,不刪除文檔中的行數,只是在屏幕中不顯示這些行
sed -i '1,5'd test.txt 使用-i 真正刪除文件中的行數
sed -i '/tobe-123/'d passwd 直接在passwd文件中把tobe-123刪除
sed -i '/user2/'d test.txt 刪除文件中的內容user2
sed '1,10s/root/toor/g' test.txt 第一行到第10行,把root所有替換爲toor
1,10是範圍 s 表明替換 g全局替換 不加的話只會替換本行出現的第一個
sed -r '1,10s/ro+/r/g' test.txt |head 要替換的內容能夠有正則表達式
第一段和最後一段替換位置
head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' ()括號須要使用-r脫義
[^:]+ 非冒號 :一個或多個
.* 貪婪匹配,一直匹配到最後一個:
前面小括號括起來的要用\3:\2:\1去表示前面三個小括號中的內容
head test.txt |sed 's@/bin/bash@123@g' 使用@ 替換分隔符,區分開
head test.txt |sed 's/[a-zA-Z]//g' 把全部字母刪除
head test.txt |sed -r 's/(.*)/aaa:&/' 在全部行前面加aaa:
& 表示星號前的全部
awk 截取文檔中的某個段落
-F選項的做用是指定分隔符,不加-F選項,默認以空格或tab爲分隔符
print 用來打印某個字段,$1表示第一段,$2表示第二段,$0表示整行
awk -F ':' '{print $1}' test.txt 打印出第一段的內容, 用 : 冒號做爲分隔符,不會更改文本內容
awk -F ':' '{print $0}' test.txt 打印出全部的內容 $0
awk -F ':' '{print $1,$3,$4}' test.txt 打印1,3,4段
awk '/oo/' test.txt 打印出包含oo的行
awk -F ':' '$1 ~ /oo/' test.txt 打印第一行的第一段包含oo的行 (~ 匹配)
awk -F ':' '$1 ~ /oo+/' test.txt 匹配第一段有oo的,也可使用正則(默認支持),不須要使用脫義符
awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt 執行多個命令,匹配第一段和第三段包含root的字符,和第一段,第三段,第四段包含user的字符打印出來
awk -F ':' '/root|user/ {print $0}' test.txt 匹配全部包含root和user段打印出來
grep -E 'root|user' test.txt 過濾兩個或多個關鍵詞
awk -F ':' '/root|user/ {print $0}' test.txt 把包含root或user的,整行打印出來
awk中能夠用邏輯符號進行判斷,==就是等於,也能夠理解爲精確匹配;
還有>、>=、<等,在和數字比較時,若把比較的數字用雙引號括起來,那麼awk不會認爲是數字,而會認爲是字符,不加雙引號則會認爲是數字
awk -F ':' '$3==0' test.txt 第三段等於0的
awk -F ':' '$3==0 {print $1}' test.txt 把第三段等於0的行打印出來,只打印第一段
awk -F ':' '$3>=10 {print $1}' test.txt 打印出第三段大於等於10的行,只打印第一段
加雙引號至關於sort不加-n,會以ASCII碼排序方式計算,會認爲是字符串而不是數字,若是針對數字,不加雙引號
awk -F ':' '$3>="1000" {print $0}' test.txt
awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt 匹配第七段不等於/sbin/nologin的有哪些
awk -F ':' '$3<$4' test.txt 匹配第三段小於第四段的
awk -F ':' '$3==$4' test.txt 匹配第三段等於第四段的
&& 而且 awk -F ':' '$3>"5" && $3<"7"' test.txt 匹配第三段大於5的和第三段小於7的
|| 或者
awk -F ':' '$3>10 || $7=="/sbin/nologin"' test.txt $3第三段大於10或者$7第七段等於/sbin/nologin
awk 的內置變量
awk經常使用的變量有OFS,NF和NR
OFS和-F選項有相似的功能,也是用來定義分隔符的,可是它是在輸出的時候定義; NF表示用分割符分割後一共有多少段;
NR表示行號。
awk -F ':' '{OFS="#"} $3>10 || $7 ~ /bash/ {print $1,$3,$7}' test.txt 以#作分隔符,第七段~(匹配)bash的,打印出第一段,第三段,第七段
OFS的用法,print打印時的分隔符
OFS分隔符,以#號爲單位,在寫條件#3>10,後面跟print語法
awk -F ':' '{OFS="#"} {if ($3>1000) print $1,$2,$3}' test.txt 若是第三段大於1000,打印出第一段,第二段和第三段
awk -F ':' '{print NR":"$0}' test.txt NR表示行號
awk -F ':' '{print NF":"$0}' test.txt NF表示有多少段
awk -F ':' 'NR<=10' test.txt 用NR做爲判斷條件,列出前10行
awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt
-F 指定分隔符爲: ,NR列出小於等於10的行,其中$1(第一段) ~(匹配) 包含/root|或者sync/的列出來
head -n 3 test.txt |awk -F ':' '$1="root"' 列出前三行,給第一段賦值等於root,此時沒有分隔符
head -n 3 test.txt |awk -F ':' '{OFS=":"}$1="r11"' 使用OFS定義一個分隔符
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt tot=tot+$3這段的意思是第一行的第三段加第二行的第三段,以此類推,實現一個循環,最後求和出一列第三段全部的和