命令名稱php
Awk pattern scanning and processing language
命令做用html
對文本和數據進行處理linux
詳細說明正則表達式
awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸(stdin)、一個或多個文件,或其它命令的輸出。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。express
語法格式編程
awk [options] 'scripts' var=value filename
經常使用參數centos
腳本基本結構數組
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename
一個awk腳本一般由BEGIN語句+模式匹配+END語句三部分組成,這三部分都是可選項編程語言
工做原理:編輯器
實例展現:
echo "hello " | awk 'BEGIN{ print "welcome" } END{ print "2017-08-08" }' welcome 2017-08-08 echo -e "hello" | awk 'BEGIN{ print "welcome" } {print} END{ print "2017-08-08" }' welcome hello 2017-08-08 #不加print參數時默認只打印當前的行 echo|awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }' hello nihao mingongge #使用print以逗號分隔時,打印則是以空格分界 echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }' mgg is mingg or mingongge #awk的print語句中雙引號其實就是個拼接做用
Awk的變量
內置變量
$0 #當前記錄 $1~$n #當前記錄的第N個字段 FS #輸入字段分隔符(-F相同做用)默認空格 RS #輸入記錄分割符,默認換行符 NF #字段個數就是列 NR #記錄數,就是行號,默認從1開始 OFS #輸出字段分隔符,默認空格 ORS #輸出記錄分割符,默認換行符
外部變量
[mingongge@ ~]#a=100 [mingongge@ ~]#b=100 [mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b 10000
Awk運算與判斷
算術運算符
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}' b 0 1 1 [mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}' 0 0 1 1 [mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}' 0 0 0 1 #和其它編程語言同樣,全部用做算術運算符進行操做,操做數自動轉爲數值,全部非數值都變爲0
賦值運算符
= += -= *= /= %= ^= **=
正則運算符
~ !~ 匹配正則表達式/不匹配正則表達式
邏輯運算符
|| && 邏輯或 邏輯與
關係運算符
< <= > >= != =
其它運算符
$ #字段引用 空格 #字符串連接符 ?: #三目運算符 ln #數組中是否存在某鍵值
Awk正則
^ 行首定位符 $ 行尾定位符 . 匹配任意單個字符 * 匹配0個或多個前導字符(包括回車) + 匹配1個或多個前導字符 ? 匹配0個或1個前導字符 [] 匹配指定字符組內的任意一個字符/^[ab] [^] 匹配不在指定字符組內的任意一個字符 () 子表達式 | 或者 \ 轉義符 ~,!~ 匹配或不匹配的條件語句 x{m} x字符重複m次 x{m,} x字符至少重複m次 X{m,n} x字符至少重複m次但不起過n次(需指定參數-posix或--re-interval)
命令名稱
Sed 一個強大的流式文本編輯器
詳細說明
sed是一種流編輯器,也是文本處理中很是好的工具,配合正則使用更強大處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」,接着用sed命令處理緩衝區的內容,完成後輸出到屏幕,接着處理下一行.
命令格式
sed [options] 'command' file(s) sed [options] -f scriptfile file(s)
經常使用參數
-e #以指定的指令來處理輸入的文本文件 -n #取消默認輸出(若是和p命令同時使用只會打印發生改變的行**) -h #幫助 -V #顯示版本信息
經常使用命令
a #在當前行下面插入文本 i #在當前行上面插入文本 c #把選定的行改成新的文本 d #刪除,刪除選擇的行 D #刪除模板塊的第一行 s #替換指定字符 h #拷貝模板塊的內容到內存中的緩衝區 H #追加模板塊的內容到內存中的緩衝區 g #得到內存緩衝區的內容,並替代當前模板塊中的文本 G #得到內存緩衝區的內容,並追加到當前模板塊文本的後面 l #列表不能打印字符的清單 n #讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令 N #追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼 p #打印匹配的行 P #(大寫)打印模板的第一行 q #退出Sed b #lable 分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾 r #file 從file中讀行 t #label if分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾 T #label 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾 w #file 寫並追加模板塊到file末尾 W #file 寫並追加模板塊的第一行到file末尾 ! #表示後面的命令對全部沒有被選定的行發生做用 = #打印當前行號碼 # #把註釋擴展到下一個換行符之前
Sed替換命令
g #表示行內全面替換(全局替換配合s命令使用) p #表示打印行 w #表示把行寫入一個文件 x #表示互換模板塊中的文本和緩衝區中的文本 y #表示把一個字符翻譯爲另外的字符(可是不用於正則表達式) 1 #子串匹配標記 & #已匹配字符串標記
Sed正則
^ #匹配行開始 $ #匹配行結束 . #匹配一個非換行符的任意字符 #匹配0個或多個字符 [] #匹配一個指定範圍內的字符 [^] #匹配一個不在指定範圍內的字符 (..) #匹配子串 & #保存搜索字符用來替換其餘字符 < #匹配單詞的開始 > #匹配單詞的結束 x{m} #重複字符x,m次 x{m,} #重複字符x,至少m次 x{m,n} #重複字符x,至少m次,很少於n次
Sed經常使用實例
一、替換操做
echo "hello world" |sed 's/ /-/1g' hello-world #從第一個空格開始全局替換成-,只不過文本中只有一個空格
二、刪除操做
sed '/^$/d' filename #刪除空白行 sed '2d' filename #刪除第二行 sed '2,$d' filename #刪除第二直到未尾全部行 sed '$d' filename #刪除最後一行 sed '/^test/'d filename #刪除以test開頭行
三、匹配替換
echo "hello world" |sed 's/w+/[&]/g' [hello] [world] echo "hello world" |sed 's/w+/"&"/g' "hello" "world" #w+匹配每個單詞,&表示匹配到的字符串 echo AAA bbb |sed 's/([A-Z]+) ([a-z]+)/[2] [1]/' [bbb] [AAA] #子串匹配替換
四、選定範圍
sed -n '/= 0/,/max/p' svnserve.conf #min-encryption = 0 #max-encryption = 256 #全部在=0到max範圍內的行都會被打印出來
五、sed多點編輯功能(-e)
[root@centos001 ~]#cat -n test 1 this is a test file 2 welcome 3 to 4 here 5 hello WORLD 6 7 linux centos6.8 8 redhat sed -e '2,6d' -e 's/linux centos6.8/Linux Centos6.8/' test this is a test file Linux Centos6.8 redhat #若是兩條命令功能同樣,那麼就須要用到下面的參數 sed --expression='s/linux centos6.8/Linux Centos6.8/' --expression='s/to/TO/' test** this is a test file welcome TO here hello WORLD Linux CenTOs6.8 redhat
六、讀入與寫入
[root@centos001 ~]#cat test1 welcom to here [root@centos001 ~]#sed '/here/r test1' test this is a test file welcome to here #welcom to here# hello WORLD linux centos6.8 redhat #將test1的文件內容讀取顯示全部匹配here行的後面 sed -n '/centos6.8/w test2' test [root@centos001 ~]#cat test2 linux centos6.8 #將test文件匹配到centos6.8的全部行都寫入到test2文件中,文件能夠不存在. #若是文件存在,就會被重定向不是追加
七、追加與插入
[root@centos001 ~]#sed '/^l/a2017-08-08' test2 linux centos6.8 2017-08-08 #在匹配以l開頭的行的後面追加2017-08-08 [root@centos001 ~]#sed '1a2017-08-08' test2 linux centos6.8 2017-08-08 #在第一行的後面追加2017-08-08 [root@centos001 ~]#sed '/^l/i2017-08-08' test2 2017-08-08 linux centos6.8 #在匹配以l開頭的行的前面插入2017-08-08 #######以上操做是不會改變文件內容################ [root@centos001 ~]#sed -i '/^l/i2017-08-08' test2 [root@centos001 ~]#cat test2 2017-08-08 linux centos6.8
八、其它命令實例
[root@centos001 ~]#cat -n test2 1 2017-08-08 2 linux centos6.8 3 08 4 5 test [root@centos001 ~]#**sed '/08/{ n; s/l/L/; }' test2 2017-08-08 Linux centos6.8 08 test #若是08匹配到就跳到下一行,將小寫l替換成大寫,注意到第三行也是被匹配到 #可是後面的條件不知足,全部沒有被替換 [root@centos001 ~]#sed '1,4y/8/9/' test2 2017-09-09 linux centos6.9 09 test #將1至4行全部的數字8替換成9 [root@centos001 ~]#**sed '1q' test2** 2017-08-08 #打印第一行內容後退出
九、打印奇數或公偶數行
[root@centos001 ~]#sed -n 'p;n' test2 20170808 08 [root@centos001 ~]#sed -n 'n;p' test2 linux centos6.8 test [root@centos001 ~]#sed -n '1~2p' test2 20170808 08 [root@centos001 ~]#sed -n '2~2p' test2 linux centos6.8 test
十、打印匹配字符串行的下一行
[root@centos001 ~]#sed -n '/linux/{n;p}' test2 08 [root@centos001 ~]#awk '/linux/{getline; print}' test2 08
命令名稱:
grep
命令做用:
文本查找或搜索工具
詳細說明:
一樣能夠配合正則表達式來搜索文本,並將匹配的行打印輸出,也可用於過濾與搜索特定字符串,使用十分靈活
經常使用參數:
-a #不要忽略二進制數據 -A #除了顯示符合範本樣式的那一行以外,並顯示該行以後的內容 -b #在顯示符合範本樣式的那一行以外,並顯示該行以前的內容 -B #除了顯示符合樣式的那一行以外,並顯示該行以前的內容 -c #計算符合範本樣式的列數 -C #除了顯示符合範本樣式的那一列以外,並顯示該列以前後的內容 -d #當指定要查找的是目錄而非文件時,必須使用這項參數,不然grep命令將回報信息並中止動做 -e #指定字符串做爲查找文件內容的範本樣式 -E #將範本樣式爲延伸的普通表示法來使用,意味着使用能使用擴展正則表達式 -f #指定範本文件,其內容有一個或多個範本樣式,讓grep查找符合範本條件的文件內容,格式爲每一列的範本樣式 -F #將範本樣式視爲固定字符串的列表 -G #將範本樣式視爲普通的表示法來使用 -h #在顯示符合範本樣式的那一列以前,不標示該列所屬的文件名稱 -H #在顯示符合範本樣式的那一列以前,標示該列的文件名稱 -i #忽略字符大小寫的差異 -l #列出文件內容符合指定的範本樣式的文件名稱 -L #列出文件內容不符合指定的範本樣式的文件名稱 -n #在顯示符合範本樣式的那一列以前,標示出該列的編號 -q #不顯示任何信息 -R/-r #此參數的效果和指定「-d recurse」參數相同 -s #不顯示錯誤信息 -v #反轉查找 -V #顯示版本信息 -w #只顯示全字符合的列 -x #只顯示全列符合的列 -y #此參數效果跟「-i」相同 -o #只輸出文件中匹配到的部分
正則表達式
^ #匹配以XX開頭的行 $ #匹配以XX結尾的行
經常使用實例:
一、在多個文件中查找:
grep "file" file_1 file_2 file_3
二、輸出除以外的全部行 -v 選項:
grep -v "file" file_name
三、標記匹配顏色 --color=auto 選項:
grep "file" file_name --color=auto
四、使用正則表達式 -E 選項:
grep -E "[1-9]+" egrep "[1-9]+"
五、只輸出文件中匹配到的部分 -o 選項:
echo this is a test line. | grep -o -E "[a-z]+." line. echo this is a test line. | egrep -o "[a-z]+." line.
六、統計文件或者文本中包含匹配字符串的行數-c 選項:
grep -c "text" file_name 2
七、輸出包含匹配字符串的行數 -n 選項:
grep "text" -n file_name 或 cat file_name | grep "text" -n
八、多個文件
grep "text" -n file_1 file_2
九、搜索多個文件並查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...
十、grep遞歸搜索文件
在多級目錄中對文本進行遞歸搜索:
grep "text" . -r -n
十一、忽略匹配樣式中的字符大小寫:
echo "hello world" | grep -i "HELLO" hello
十二、選項 -e 指定多個匹配樣式:
echo this is a text line | grep -e "is" -e "line" -o is line
1三、也可使用 -f 選項來匹配多個樣式,在樣式文件中逐行寫出須要匹配的字符。
cat patfile aaa bbb echo aaa bbb ccc ddd eee | grep -f patfile -o
1四、在grep搜索結果中包括或者排除指定文件:
只在目錄中全部的.php和.html文件中遞歸搜索字符"main()"
grep "main()" . -r --include *.{php,html}
1五、在搜索結果中排除全部README文件
grep "main()" . -r --exclude "README"
1六、在搜索結果中排除filelist文件列表裏的文件
grep "main()" . -r --exclude-from filelist
Linux三劍客Awk、Sed、Grep 命令詳解,到這裏就介紹完了。歡迎評論、點贊、轉發分享支持。
注:未經受權,禁止任何方式的轉載。