Linux 三劍客 Awk、Sed、Grep 命令詳解
Linux三劍客Awk命令詳解
命令名稱
Awk pattern scanning and processing language
命令作用
對文字和資料進行處理
詳細說明
awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸(stdin)、一個或多個檔案,或其它命令的輸出。它在命令列中使用,但更多是作為指令碼來使用。awk有很多內建的功能,比如陣列、函式等,這是它和C語言的相同之處,靈活性是awk最大的優勢。
語法格式
awk [options] 'scripts' var=value filename
常用引數
- -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"; 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)
Linux三劍客Sed命令詳解
命令名稱
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常用例項
1、替換操作
echo "hello world" |sed 's/ /-/1g'
hello-world
#從第一個空格開始全域性替換成-,只不過文字中只有一個空格
2、刪除操作
sed '/^$/d' filename #刪除空白行
sed '2d' filename #刪除第二行
sed '2,$d' filename #刪除第二直到未尾所有行
sed '$d' filename #刪除最後一行
sed '/^test/'d filename #刪除以test開頭行
3、匹配替換
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]
#子串匹配替換
4、選定範圍
sed -n '/= 0/,/max/p' svnserve.conf
#min-encryption = 0
#max-encryption = 256
#所有在=0到max範圍內的行都會被列印出來
5、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
6、讀入與寫入
[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檔案中,檔案可以不存在.
#如果檔案存在,就會被重定向不是追加
7、追加與插入
[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
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
#列印第一行內容後退出
9、列印奇數或公偶數行
[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
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 #此引數的效果和指定“-d recurse”引數相同
-s #不顯示錯誤資訊
-v #反轉查詢
-V #顯示版本資訊
-w #只顯示全字元合的列
-x #只顯示全列符合的列
-y #此引數效果跟“-i”相同
-o #只輸出檔案中匹配到的部分
正規表示式
^ #匹配以XX開頭的行
$ #匹配以XX結尾的行
常用例項
1、在多個檔案中查詢:
grep "file" file_1 file_2 file_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 選項:
echo this is a test line. | grep -o -E "[a-z]+."
line.
echo this is a test line. | egrep -o "[a-z]+."
line.
6、統計檔案或者文字中包含匹配字串的行數-c 選項:
grep -c "text" file_name
2
7、輸出包含匹配字串的行數 -n 選項:
grep "text" -n file_name
或
cat file_name | grep "text" -n
8、多個檔案
grep "text" -n file_1 file_2
9、搜尋多個檔案並查詢匹配文字在哪些檔案中:
grep -l "text" file1 file2 file3...
10、grep遞迴搜尋檔案
在多級目錄中對文字進行遞迴搜尋:
grep "text" . -r -n
11、忽略匹配樣式中的字元大小寫:
echo "hello world" | grep -i "HELLO"
hello
12、選項 -e 指定多個匹配樣式:
echo this is a text line | grep -e "is" -e "line" -o
is
line
13、也可以使用 -f 選項來匹配多個樣式,在樣式檔案中逐行寫出需要匹配的字元。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -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-from filelist
更多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
#顯示包括K k的行
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.*/JOSE HAS RETIRE/g' testfile
#將包含Jose的行替換成JOSE HAS RETIRE
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 - 2 5 5中任意整數
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/'p testfile
#從第三行開始查詢到245700結束並列印
sed -n '2,26!'p testfile
#列印檔案(除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~/Tommy Savage/ {print $5}' 2.txt
awk -F : '($1 == "Tommy Savage") {print $5}' 2.txt
#列印以:分隔且第一列為Tommy Savage的第五列內容
ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
#統計目錄個的檔案所有的位元組數
awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'
#以M為單位顯示目錄下的所有位元組數
awk 'BEGIN{a=10;a+=10;print a}'
20
#a+10等價於 a=a+10
echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}'
#正則匹配a 是否有test字元,成立列印ok
awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err
#三目運算子?:
awk '/root/{print $0}' passwd
#匹配所有包含root的行
awk -F: '$5~/root/{print $0}' passwd
# 以分號作為分隔符,匹配第5個欄位是root的行
ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'
#列印IP地址
awk '{print toupper($0)}' test.txt
#toupper是awk內建函式,將所小寫字母轉換成大寫
相關文章
- Linux三劍客Awk、Sed、Grep 命令詳解Linux
- 效能工具之linux三劍客awk、grep、sed詳解Linux
- Linux三劍客grep、awk和sedLinux
- linux三劍客(grep、sed、awk)基本使用Linux
- Linux:管道命令與文字處理三劍客(grep、sed、awk)Linux
- Linux (三劍客之三) awk命令詳解Linux
- Linux三劍客之grep詳解Linux
- Linux三劍客之awk詳解Linux
- Linux 三劍客之 grep 使用詳解Linux
- Linux (三劍客之一) grep字串搜尋命令詳解Linux字串
- shell 中 grep、sed、awk 命令
- 006 Linux 命令三劍客之-grepLinux
- Linux 三劍客之 awk 實戰詳解教程Linux
- 【shell筆記>命令】grep,sed,awk筆記
- Shell字元操作命令——grep、sed、awk字元
- 007 Linux 命令三劍客之-awkLinux
- Linux系統命令三劍客之 awkLinux
- 指令碼三兄弟 grep、awk、sed指令碼
- Linux命令之grep/sed/awk等行轉列Linux
- Linux 三劍客之sedLinux
- Linux三劍客之sedLinux
- 【案例】Linux三劍客中awk命令如何使用?Linux
- Linux系統中的管道命令、grep命令、sed命令和awk命令Linux
- 寶付揭秘Linux支付命令操作之grep、sed、awkLinux
- linux awk sed grep awk 求和平均最大最小Linux
- Linux三大劍客之awkLinux
- Linux 文字處理工具(grep sed awk )Linux
- awk sed 用法詳解
- 三劍客詳解
- Linux三劍客之awk入門指引Linux
- Linux常用基本命令:三劍客命令之-awk格式化動作Linux
- Linux檔案處理三劍客之sedLinux
- Linux檔案處理三劍客之grepLinux
- Linux sed 命令詳解Linux
- Linux sed命令詳解Linux
- linux grep命令詳解Linux
- Linux命令grep詳解Linux
- Linux檔案處理三劍客之awkLinux