0411正則(sed、awk)

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"}'

 

 

1、sed:

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: 

& 表示星號前的全部

2、awk:

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這段的意思是第一行的第三段加第二行的第三段,以此類推,實現一個循環,最後求和出一列第三段全部的和

相關文章
相關標籤/搜索