1. 程式人生 > 實用技巧 >Linux三劍客Awk、Sed、Grep 命令詳解【轉】

Linux三劍客Awk、Sed、Grep 命令詳解【轉】

Linux三劍客Awk命令詳解

命令名稱

Awkpatternscanningandprocessinglanguage

命令作用

對文字和資料進行處理

詳細說明

awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸(stdin)、一個或多個檔案,或其它命令的輸出。它在命令列中使用,但更多是作為指令碼來使用。awk有很多內建的功能,比如陣列、函式等,這是它和C語言的相同之處,靈活性是awk最大的優勢。

語法格式

awk[options]'scripts'var=valuefilename

常用引數

  • -F 指定分隔符(可以是字串或正則表示式)
  • -f 從指令碼檔案中讀取awk命令
  • -v var=value 賦值變數,將外部變數傳遞給awk

指令碼基本結構

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename

一個awk指令碼通常由BEGIN語句+模式匹配+END語句三部分組成,這三部分都是可選項

工作原理:

  • 第一步執行BEGIN 語句
  • 第二步從檔案或標準輸入讀取一行,然後再執行pattern語句,逐行掃描檔案到檔案全部被讀取
  • 第三步執行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";printa,b,c;}'
hellonihaomingongge
#使用print以逗號分隔時,列印則是以空格分界

echo|awk'{a="mgg";b="mingg";c="mingongge";printa"is"b"or"c;}'
mggisminggormingongge
#awk的print語句中雙引號其實就是個拼接作用

Awk的變數

內建變數

$0#當前記錄
$1~$n#當前記錄的第N個欄位
FS#輸入欄位分隔符(-F相同作用)預設空格
RS#輸入記錄分割符,預設換行符
NF#欄位個數就是列
NR#記錄數,就是行號,預設從1開始
OFS#輸出欄位分隔符,預設空格
ORS#輸出記錄分割符,預設換行符

外部變數

[mingongge@~]#a=100
[mingongge@~]#b=100
[mingongge@~]#echo|awk'{printv1*v2}'v1=$av2=$b
10000

Awk運算與判斷

算術運算子

+-加減
*/&乘除求餘
^*求冪
++--增加或減少,作為字首或字尾
[mingongge@~]#awk'BEGIN{a="b";printa,a++,a--,++a;}'
b011

[mingongge@~]#awk'BEGIN{a="0";printa,a++,a--,++a;}'
0011

[mingongge@~]#awk'BEGIN{a="0";printa,a++,--a,++a;}'
0001

#和其它程式語言一樣,所有用作算術運算子進行操作,運算元自動轉為數值,所有非數值都變為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)

Linux三劍客Sed命令詳解

命令名稱

Sed 一個強大的流式文字編輯器

詳細說明

sed是一種流編輯器,也是文字處理中非常好的工具,配合正則使用更強大處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”,接著用sed命令處理緩衝區的內容,完成後輸出到螢幕,接著處理下一行.

命令格式

sed[options]'command'file(s)
sed[options]-fscriptfilefile(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#labelif分支,從最後一行開始,條件一旦滿足或者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常用例項

1、替換操作

echo"helloworld"|sed's//-/1g'
hello-world
#從第一個空格開始全域性替換成-,只不過文字中只有一個空格

2、刪除操作

sed'/^$/d'filename#刪除空白行

sed'2d'filename#刪除第二行

sed'2,$d'filename#刪除第二直到未尾所有行

sed'$d'filename#刪除最後一行

sed'/^test/'dfilename#刪除以test開頭行

3、匹配替換

echo"helloworld"|sed's/w+/[&]/g'
[hello][world]
echo"helloworld"|sed's/w+/"&"/g'
"hello""world"
#w+匹配每一個單詞,&表示匹配到的字串

echoAAAbbb|sed's/([A-Z]+)([a-z]+)/[2][1]/'
[bbb][AAA]
#子串匹配替換

4、選定範圍

sed-n'/=0/,/max/p'svnserve.conf
#min-encryption=0
#max-encryption=256

#所有在=0到max範圍內的行都會被打印出來

5、sed多點編輯功能(-e)

[root@centos001~]#cat-ntest
1thisisatestfile
2welcome
3to
4here
5helloWORLD
6
7linuxcentos6.8
8redhat

sed-e'2,6d'-e's/linuxcentos6.8/LinuxCentos6.8/'test
thisisatestfile
LinuxCentos6.8
redhat
#如果兩條命令功能一樣,那麼就需要用到下面的引數

sed--expression='s/linuxcentos6.8/LinuxCentos6.8/'--expression='s/to/TO/'test**
thisisatestfile
welcome
TO
here
helloWORLD
LinuxCenTOs6.8
redhat

6、讀入與寫入

[root@centos001~]#cattest1
welcom
to
here

[root@centos001~]#sed'/here/rtest1'test
thisisatestfile
welcome
to
here
#welcom
to
here#
helloWORLD
linuxcentos6.8
redhat

#將test1的檔案內容讀取顯示所有匹配here行的後面
sed-n'/centos6.8/wtest2'test

[root@centos001~]#cattest2
linuxcentos6.8

#將test檔案匹配到centos6.8的所有行都寫入到test2檔案中,檔案可以不存在.
#如果檔案存在,就會被重定向不是追加

7、追加與插入

[root@centos001~]#sed'/^l/a2017-08-08'test2
linuxcentos6.8
2017-08-08
#在匹配以l開頭的行的後面追加2017-08-08

[root@centos001~]#sed'1a2017-08-08'test2
linuxcentos6.8
2017-08-08
#在第一行的後面追加2017-08-08

[root@centos001~]#sed'/^l/i2017-08-08'test2
2017-08-08
linuxcentos6.8
#在匹配以l開頭的行的前面插入2017-08-08
#######以上操作是不會改變檔案內容################

[root@centos001~]#sed-i'/^l/i2017-08-08'test2
[root@centos001~]#cattest2
2017-08-08
linuxcentos6.8

8、其它命令例項

[root@centos001~]#cat-ntest2
12017-08-08
2linuxcentos6.8
308
4
5test

[root@centos001~]#**sed'/08/{n;s/l/L/;}'test2
2017-08-08
Linuxcentos6.8
08
test
#如果08匹配到就跳到下一行,將小寫l替換成大寫,注意到第三行也是被匹配到
#但是後面的條件不滿足,所有沒有被替換

[root@centos001~]#sed'1,4y/8/9/'test2
2017-09-09
linuxcentos6.9
09
test
#將1至4行所有的數字8替換成9

[root@centos001~]#**sed'1q'test2**
2017-08-08
#列印第一行內容後退出

9、列印奇數或公偶數行

[root@centos001~]#sed-n'p;n'test2
20170808
08

[root@centos001~]#sed-n'n;p'test2
linuxcentos6.8
test

[root@centos001~]#sed-n'1~2p'test2
20170808
08

[root@centos001~]#sed-n'2~2p'test2
linuxcentos6.8
test

10、列印匹配字串行的下一行

[root@centos001~]#sed-n'/linux/{n;p}'test2
08

[root@centos001~]#awk'/linux/{getline;print}'test2
08

Linux三劍客Grep 命令詳解

命令名稱

grep

命令作用

文字查詢或搜尋工具

詳細說明

同樣可以配合正則表示式來搜尋文字,並將匹配的行列印輸出,也可用於過濾與搜尋特定字串,使用十分靈活

常用引數

-a#不要忽略二進位制資料
-A#除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容
-b#在顯示符合範本樣式的那一行之外,並顯示該行之前的內容
-B#除了顯示符合樣式的那一行之外,並顯示該行之前的內容
-c#計算符合範本樣式的列數
-C#除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容
-d#當指定要查詢的是目錄而非檔案時,必須使用這項引數,否則grep命令將回報資訊並停止動作
-e#指定字串作為查詢檔案內容的範本樣式
-E#將範本樣式為延伸的普通表示法來使用,意味著使用能使用擴充套件正則表示式
-f#指定範本檔案,其內容有一個或多個範本樣式,讓grep查詢符合範本條件的檔案內容,格式為每一列的範本樣式
-F#將範本樣式視為固定字串的列表
-G#將範本樣式視為普通的表示法來使用
-h#在顯示符合範本樣式的那一列之前,不標示該列所屬的檔名稱
-H#在顯示符合範本樣式的那一列之前,標示該列的檔名稱
-i#忽略字元大小寫的差別
-l#列出檔案內容符合指定的範本樣式的檔名稱
-L#列出檔案內容不符合指定的範本樣式的檔名稱
-n#在顯示符合範本樣式的那一列之前,標示出該列的編號
-q#不顯示任何資訊
-R/-r#此引數的效果和指定“-drecurse”引數相同
-s#不顯示錯誤資訊
-v#反轉查詢
-V#顯示版本資訊
-w#只顯示全字符合的列
-x#只顯示全列符合的列
-y#此引數效果跟“-i”相同
-o#只輸出文件中匹配到的部分
正則表示式
^#匹配以XX開頭的行
$#匹配以XX結尾的行

常用例項

1、在多個檔案中查詢:

grep"file"file_1file_2file_3

2、輸出除之外的所有行 -v 選項:

grep-v"file"file_name

3、標記匹配顏色 --color=auto 選項:

grep"file"file_name--color=auto

4、使用正則表示式 -E 選項:

grep-E"[1-9]+"

egrep"[1-9]+"

5、只輸出文件中匹配到的部分 -o 選項:

echothisisatestline.|grep-o-E"[a-z]+."
line.

echothisisatestline.|egrep-o"[a-z]+."
line.

6、統計檔案或者文字中包含匹配字串的行數-c 選項:

grep-c"text"file_name
2

7、輸出包含匹配字串的行數 -n 選項:

grep"text"-nfile_name

catfile_name|grep"text"-n

8、多個檔案

grep"text"-nfile_1file_2

9、搜尋多個檔案並查詢匹配文字在哪些檔案中:

grep-l"text"file1file2file3...

10、grep遞迴搜尋檔案

在多級目錄中對文字進行遞迴搜尋:

grep"text".-r-n

11、忽略匹配樣式中的字元大小寫:

echo"helloworld"|grep-i"HELLO"
hello

12、選項 -e 指定多個匹配樣式:

echothisisatextline|grep-e"is"-e"line"-o
is
line

13、也可以使用 -f 選項來匹配多個樣式,在樣式檔案中逐行寫出需要匹配的字元。

catpatfile
aaa
bbb

echoaaabbbcccdddeee|grep-fpatfile-o

14、在grep搜尋結果中包括或者排除指定檔案:

只在目錄中所有的.php和.html檔案中遞迴搜尋字元"main()"

grep"main()".-r--include*.{php,html}

15、在搜尋結果中排除所有README檔案

grep"main()".-r--exclude"README"

16、在搜尋結果中排除filelist檔案列表裡的檔案

grep"main()".-r--exclude-fromfilelist

更多Linux命令請參考>>>值得收藏!Linux系統常用命令速查手冊

Linux 三劍客命令實戰操作

Grep例項介紹

grep"San"testfile
#過濾有San的行

grep'^J'testfile
#顯示以J開頭的行

grep'70$'testfile
#顯示以70結尾的行

grep-v"834"testfile
#顯示所有不包括834的行

grep':12/'testfile
#顯示:12/的行

grep':498-'testfile
#顯示:498-的行

grep'[A-Z][a-z]{4}:[[:space:]][A-Z]'testfile
#顯示這樣的行,一個大寫字母+四個小寫字母+空格+一個大寫字母

grep'[a-z]{1,}[[:space:]][Kk]'testfile
#顯示包括Kk的行

grep-n'[0-9]{6,}$'testfile
#顯示6位數字的行,並列印行號

grep-i"lincoln"testfile
#顯示有lincoln的行,不區分大小寫

Sed例項介紹

sed's/Jon/Jonathan/g'testfile
#全域性替換(Jon替換成Jonathan)

sed'1,3d'testfile
#刪除檔案1-3行

sed-n'5,10p'testfile
#列印檔案5-10行內容

sed'/Lane/d'testfile
#刪除包包含lane的行

sed-ne'/[1-9]{5}:1[12]/p'testfile
#列印由5個數字+:11/12的行

sed's/^Fred/***&/'testfile
#在以Fred開頭的行前加上***

sed-e's/.*Jose.*/JOSEHASRETIRE/g'testfile
#將包含Jose的行替換成JOSEHASRETIRE

sed-n'/^Popeye/p'testfile|sed's/[0-9]{1,}/[0-9]{1,}/[0-9]{1,}/11/14/46/'
#將以Popeye開頭的行列印,然後將“數字/數字/數字”這格式的數字串替換成11/14/46

##pattern{n}匹配模式出現n次。
##pattern{n,}匹配模式出現最少n次。
##pattern{n,m}匹配模式出現n到m次之間,n,m為0-255中任意整數

sed'/^$/d'testfile
#刪除所有空行

sed's/.$//g'
#刪除以.結尾行

sed's/^[][]*//g'
#刪除行首空格

sed's//.[][]*/[]/g'
#刪除句號後跟兩個或更多的空格,用一個空格代替

sed's/^.//g'
#刪除第一個字元

sed's/COL/(.../)//g'
#刪除緊跟COL的後三個字元

sed's/^////g'
#刪除路徑中第一個/

sed-n'3,/245700/'ptestfile
#從第三行開始查詢到245700結束並列印

sed-n'2,26!'ptestfile
#列印檔案(除2-26)的行

Awk例項介紹

awk–F:‘{print$2}’datafile
#以:分隔列印第二列

awk–F:‘/^Dan/{print$2}’datafile
#以:分隔列印以Dan開頭行的第二列內容

awk–F:‘/^[CE]/{print$1}’datafile
#列印以C或E開頭行的第一列

awk–F:‘{if(length($1)==4)print$1}’datafile
#列印以:分隔且長度為4字元的第一列內容

awk–F:‘/[916]/{print$1}’datafile
#匹配916的行以:分隔列印第一列

awk-F:'/^Vinh/{print"a"$5}'2.txt
#顯示以Dan開頭行並在第五列前加上a

awk–F:‘{print$2”,”$1}’datafile
#列印第二列第一列並以,分隔

awk-F:'($5==68900){print$1}'2.txt
#以:分隔列印第五列是68900的行第一列

awk-F:'{if(length($1)==11)print$1}'2.txt
#列印以:分隔且長度為4字元的第一列內容

awk-F:'$1~/TommySavage/{print$5}'2.txt
awk-F:'($1=="TommySavage"){print$5}'2.txt
#列印以:分隔且第一列為TommySavage的第五列內容

ll|awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size}'
#統計目錄個的檔案所有的位元組數

awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size/1024/1024,"M"}'
#以M為單位顯示目錄下的所有位元組數

awk'BEGIN{a=10;a+=10;printa}'
20
#a+10等價於a=a+10

echo|awk'BEGIN{a="100testaaa"}a~/test/{print"ok"}'
#正則匹配a是否有test字元,成立列印ok

awk'BEGIN{a="b";printa=="b"?"ok":"err"}'
ok
awk'BEGIN{a="b";printa=="c"?"ok":"err"}'
err
#三目運算子?:

awk'/root/{print$0}'passwd
#匹配所有包含root的行

awk-F:'$5~/root/{print$0}'passwd
#以分號作為分隔符,匹配第5個欄位是root的行

ifconfigeth0|awk'BEGIN{FS="[[:space:]:]+"}NR==2{print$4}'
#列印IP地址

awk'{printtoupper($0)}'test.txt
#toupper是awk內建函式,將所小寫字母轉換成大寫

轉自

Linux 三劍客 Awk、Sed、Grep 命令詳解 https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247503585&idx=1&sn=4479870e9509cfea8221b7034f2eb8ac&chksm=e918abfdde6f22eb129d650de68059e16862b98889ba63843e64f710429b56333b045687b81c&scene=0&xtrack=1&key=b6d2dbec5ec06df72b2c2d88f178d4ddd6367417500ab60f8a486dd075a6bc7a32aeae74289ccf801afc09c51510006e5ef071b662ad68a89d60b95267aae9ea7dfc5cafcfacd75cbf607dd2da4803059ae182ddf62cea202dcd36862fda811483259ce5527702be3169e0d85023e7f39c4b12bcc621883c7c4703756940696c&ascene=1&uin=Mjk2Njc3MTAyMQ%3D%3D&devicetype=Windows+7&version=62060739&lang=zh_CN&exportkey=ARhnM8DkOXx%2FrwEazhk3jEo%3D&pass_ticket=psDQwP7mOvnQj8o987zNhs4AV2xZ7%2BEkC9EFtItKP2XXp25%2FenSiYTSKhwi6a7WH&wx_header=0