本篇文章為大家展示了Linux中Awk和Sed及Grep命令是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站技術(shù)團(tuán)隊(duì)10余年來(lái)致力于為客戶提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站、成都品牌網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了上千多家網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。
Linux Awk命令詳解
命令名稱(chēng)
Awk pattern scanning and processing language
命令作用
對(duì)文本和數(shù)據(jù)進(jìn)行處理
詳細(xì)說(shuō)明
awk 是一種編程語(yǔ)言,用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來(lái)自標(biāo)準(zhǔn)輸(stdin)、一個(gè)或多個(gè)文件,或其它命令的輸出。它在命令行中使用,但更多是作為腳本來(lái)使用。awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語(yǔ)言的相同之處,靈活性是awk最大的優(yōu)勢(shì)。
語(yǔ)法格式
awk [options] 'scripts' var=value filename
常用參數(shù)
腳本基本結(jié)構(gòu)
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename
一個(gè)awk腳本通常由BEGIN語(yǔ)句+模式匹配+END語(yǔ)句三部分組成,這三部分都是可選項(xiàng)
工作原理:
實(shí)例展示:
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參數(shù)時(shí)默認(rèn)只打印當(dāng)前的行
echo|awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }'
hello nihao mingongge
#使用print以逗號(hào)分隔時(shí),打印則是以空格分界
echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }'
mgg is mingg or mingongge
#awk的print語(yǔ)句中雙引號(hào)其實(shí)就是個(gè)拼接作用
Awk的變量
內(nèi)置變量
$0 #當(dāng)前記錄
$1~$n #當(dāng)前記錄的第N個(gè)字段
FS #輸入字段分隔符(-F相同作用)默認(rèn)空格
RS #輸入記錄分割符,默認(rèn)換行符
NF #字段個(gè)數(shù)就是列
NR #記錄數(shù),就是行號(hào),默認(rèn)從1開(kāi)始
OFS #輸出字段分隔符,默認(rèn)空格
ORS #輸出記錄分割符,默認(rèn)換行符
外部變量
[mingongge@ ~]#a=100
[mingongge@ ~]#b=100
[mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b
10000
Awk運(yùn)算與判斷
算術(shù)運(yùn)算符
+ - 加減
* / & 乘 除 求余
^ * 求冪
++ -- 增加或減少,作為前綴或后綴
[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
#和其它編程語(yǔ)言一樣,所有用作算術(shù)運(yùn)算符進(jìn)行操作,操作數(shù)自動(dòng)轉(zhuǎn)為數(shù)值,所有非數(shù)值都變?yōu)?
賦值運(yùn)算符
= += -= *= /= %= ^= **=
正則運(yùn)算符
~ !~ 匹配正則表達(dá)式/不匹配正則表達(dá)式
邏輯運(yùn)算符
|| && 邏輯或 邏輯與
關(guān)系運(yùn)算符
< <= > >= != =
其它運(yùn)算符
$ 字段引用
空格 字符串鏈接符
?: 三目運(yùn)算符
ln 數(shù)組中是否存在某鍵值
Awk正則
^ 行首定位符
$ 行尾定位符
. 匹配任意單個(gè)字符
* 匹配0個(gè)或多個(gè)前導(dǎo)字符(包括回車(chē))
+ 匹配1個(gè)或多個(gè)前導(dǎo)字符
? 匹配0個(gè)或1個(gè)前導(dǎo)字符
[] 匹配指定字符組內(nèi)的任意一個(gè)字符/^[ab]
[^] 匹配不在指定字符組內(nèi)的任意一個(gè)字符
() 子表達(dá)式
| 或者
\ 轉(zhuǎn)義符
~,!~ 匹配或不匹配的條件語(yǔ)句
x{m} x字符重復(fù)m次
x{m,} x字符至少重復(fù)m次
X{m,n} x字符至少重復(fù)m次但不起過(guò)n次(需指定參數(shù)-posix或--re-interval)
命令名稱(chēng)
Sed 一個(gè)強(qiáng)大的流式文本編輯器
詳細(xì)說(shuō)明
sed是一種流編輯器,也是文本處理中非常好的工具,配合正則使用更強(qiáng)大處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱(chēng)為“模式空間”,接著用sed命令處理緩沖區(qū)的內(nèi)容,完成后輸出到屏幕,接著處理下一行.
命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
常用參數(shù)
-e #以指定的指令來(lái)處理輸入的文本文件
-n #取消默認(rèn)輸出(如果和p命令同時(shí)使用只會(huì)打印發(fā)生改變的行)
-h #幫助
-V #顯示版本信息
常用命令
a #在當(dāng)前行下面插入文本
i #在當(dāng)前行上面插入文本
c #把選定的行改為新的文本
d #刪除,刪除選擇的行
D #刪除模板塊的第一行
s #替換指定字符
h #拷貝模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)
H #追加模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)
g #獲得內(nèi)存緩沖區(qū)的內(nèi)容,并替代當(dāng)前模板塊中的文本
G #獲得內(nèi)存緩沖區(qū)的內(nèi)容,并追加到當(dāng)前模板塊文本的后面
l #列表不能打印字符的清單
n #讀取下一個(gè)輸入行,用下一個(gè)命令處理新的行而不是用第一個(gè)命令
N #追加下一個(gè)輸入行到模板塊后面并在二者間嵌入一個(gè)新行,改變當(dāng)前行號(hào)碼
p #打印匹配的行
P #(大寫(xiě))打印模板的第一行
q #退出Sed
b #lable 分支到腳本中帶有標(biāo)記的地方,如果分支不存在則分支到腳本的末尾
r #file 從file中讀行
t #label if分支,從最后一行開(kāi)始,條件一旦滿足或者T,t命令,將導(dǎo)致分支到帶有標(biāo)號(hào)的命令處,或者到腳本的末尾
T #label 錯(cuò)誤分支,從最后一行開(kāi)始,一旦發(fā)生錯(cuò)誤或者T,t命令,將導(dǎo)致分支到帶有標(biāo)號(hào)的命令處,或者到腳本的末尾
w #file 寫(xiě)并追加模板塊到file末尾**
W #file 寫(xiě)并追加模板塊的第一行到file末尾**
! #表示后面的命令對(duì)所有沒(méi)有被選定的行發(fā)生作用**
= #打印當(dāng)前行號(hào)碼**
# #把注釋擴(kuò)展到下一個(gè)換行符以前**
Sed替換命令
g #表示行內(nèi)全面替換(全局替換配合s命令使用)
p #表示打印行
w #表示把行寫(xiě)入一個(gè)文件
x #表示互換模板塊中的文本和緩沖區(qū)中的文本
y #表示把一個(gè)字符翻譯為另外的字符(但是不用于正則表達(dá)式)
1 #子串匹配標(biāo)記
& #已匹配字符串標(biāo)記
Sed正則
^ #匹配行開(kāi)始
$ #匹配行結(jié)束
. #匹配一個(gè)非換行符的任意字符
* #匹配0個(gè)或多個(gè)字符
[] #匹配一個(gè)指定范圍內(nèi)的字符
[^] #匹配一個(gè)不在指定范圍內(nèi)的字符
(..) #匹配子串
& #保存搜索字符用來(lái)替換其他字符
< #匹配單詞的開(kāi)始
> #匹配單詞的結(jié)束
x{m} #重復(fù)字符x,m次
x{m,} #重復(fù)字符x,至少m次
x{m,n} #重復(fù)字符x,至少m次,不多于n次
Sed常用實(shí)例
1、替換操作
echo "hello world" |sed 's/ /-/1g'
hello-world
#從第一個(gè)空格開(kāi)始全局替換成-,只不過(guò)文本中只有一個(gè)空格
2、刪除操作
sed '/^$/d' filename #刪除空白行
sed '2d' filename #刪除第二行
sed '2,$d' filename #刪除第二直到未尾所有行
sed '$d' filename #刪除最后一行
sed '/^test/'d filename #刪除以test開(kāi)頭行
3、匹配替換
echo "hello world" |sed 's/w+/[&]/g'
[hello] [world]
echo "hello world" |sed 's/w+/"&"/g'
"hello" "world"
#w+匹配每一個(gè)單詞,&表示匹配到的字符串
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范圍內(nèi)的行都會(huì)被打印出來(lái)
5、sed多點(diǎn)編輯功能(-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
#如果兩條命令功能一樣,那么就需要用到下面的參數(shù)
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、讀入與寫(xiě)入
[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的文件內(nèi)容讀取顯示所有匹配here行的后面
sed -n '/centos6.8/w test2' test
[root@centos001 ~]#cat test2
linux centos6.8
#將test文件匹配到centos6.8的所有行都寫(xiě)入到test2文件中,文件可以不存在.
#如果文件存在,就會(huì)被重定向不是追加
7、追加與插入
[root@centos001 ~]#sed '/^l/a2017-08-08' test2
linux centos6.8
2017-08-08
#在匹配以l開(kāi)頭的行的后面追加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開(kāi)頭的行的前面插入2017-08-08
#######以上操作是不會(huì)改變文件內(nèi)容################
[root@centos001 ~]#sed -i '/^l/i2017-08-08' test2
[root@centos001 ~]#cat test2
2017-08-08
linux centos6.8
8、其它命令實(shí)例
[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匹配到就跳到下一行,將小寫(xiě)l替換成大寫(xiě),注意到第三行也是被匹配到
#但是后面的條件不滿足,所有沒(méi)有被替換
[root@centos001 ~]#sed '1,4y/8/9/' test2
2017-09-09
linux centos6.9
09
test
#將1至4行所有的數(shù)字8替換成9
[root@centos001 ~]#**sed '1q' test2**
2017-08-08
#打印第一行內(nèi)容后退出
9、打印奇數(shù)或公偶數(shù)行
[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
命令名稱(chēng)
grep
命令作用
文本查找或搜索工具
詳細(xì)說(shuō)明
同樣可以配合正則表達(dá)式來(lái)搜索文本,并將匹配的行打印輸出,也可用于過(guò)濾與搜索特定字符串,使用十分靈活
常用參數(shù)
-a #不要忽略二進(jìn)制數(shù)據(jù)
-A #除了顯示符合范本樣式的那一行之外,并顯示該行之后的內(nèi)容
-b #在顯示符合范本樣式的那一行之外,并顯示該行之前的內(nèi)容
-B #除了顯示符合樣式的那一行之外,并顯示該行之前的內(nèi)容
-c #計(jì)算符合范本樣式的列數(shù)
-C #除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內(nèi)容
-d #當(dāng)指定要查找的是目錄而非文件時(shí),必須使用這項(xiàng)參數(shù),否則grep命令將回報(bào)信息并停止動(dòng)作
-e #指定字符串作為查找文件內(nèi)容的范本樣式
-E #將范本樣式為延伸的普通表示法來(lái)使用,意味著使用能使用擴(kuò)展正則表達(dá)式
-f #指定范本文件,其內(nèi)容有一個(gè)或多個(gè)范本樣式,讓grep查找符合范本條件的文件內(nèi)容,格式為每一列的范本樣式
-F #將范本樣式視為固定字符串的列表
-G #將范本樣式視為普通的表示法來(lái)使用
-h #在顯示符合范本樣式的那一列之前,不標(biāo)示該列所屬的文件名稱(chēng)
-H #在顯示符合范本樣式的那一列之前,標(biāo)示該列的文件名稱(chēng)
-i #忽略字符大小寫(xiě)的差別
-l #列出文件內(nèi)容符合指定的范本樣式的文件名稱(chēng)
-L #列出文件內(nèi)容不符合指定的范本樣式的文件名稱(chēng)
-n #在顯示符合范本樣式的那一列之前,標(biāo)示出該列的編號(hào)
-q #不顯示任何信息
-R/-r #此參數(shù)的效果和指定“-d recurse”參數(shù)相同
-s #不顯示錯(cuò)誤信息
-v #反轉(zhuǎn)查找
-V #顯示版本信息
-w #只顯示全字符合的列
-x #只顯示全列符合的列
-y #此參數(shù)效果跟“-i”相同
-o #只輸出文件中匹配到的部分
正則表達(dá)式
^ #匹配以XX開(kāi)頭的行
$ #匹配以XX結(jié)尾的行
常用實(shí)例
1、在多個(gè)文件中查找:
grep "file" file_1 file_2 file_3
2、輸出除之外的所有行 -v 選項(xiàng):
grep -v "file" file_name
3、標(biāo)記匹配顏色 --color=auto 選項(xiàng):
grep "file" file_name --color=auto
4、使用正則表達(dá)式 -E 選項(xiàng):
grep -E "[1-9]+"
egrep "[1-9]+"
5、只輸出文件中匹配到的部分 -o 選項(xiàng):
echo this is a test line. | grep -o -E "[a-z]+."
line.
echo this is a test line. | egrep -o "[a-z]+."
line.
6、統(tǒng)計(jì)文件或者文本中包含匹配字符串的行數(shù)-c 選項(xiàng):
grep -c "text" file_name
2
7、輸出包含匹配字符串的行數(shù) -n 選項(xiàng):
grep "text" -n file_name
或
cat file_name | grep "text" -n
8、多個(gè)文件
grep "text" -n file_1 file_2
9、搜索多個(gè)文件并查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...
10、grep遞歸搜索文件
在多級(jí)目錄中對(duì)文本進(jìn)行遞歸搜索:
grep "text" . -r -n
11、忽略匹配樣式中的字符大小寫(xiě):
echo "hello world" | grep -i "HELLO"
hello
12、選項(xiàng) -e 指定多個(gè)匹配樣式:
echo this is a text line | grep -e "is" -e "line" -o
is
line
13、也可以使用 -f 選項(xiàng)來(lái)匹配多個(gè)樣式,在樣式文件中逐行寫(xiě)出需要匹配的字符。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
14、在grep搜索結(jié)果中包括或者排除指定文件:
只在目錄中所有的.php和.html文件中遞歸搜索字符"main()"
grep "main()" . -r --include *.{php,html}
15、在搜索結(jié)果中排除所有README文件
grep "main()" . -r --exclude "README"
16、在搜索結(jié)果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
Grep實(shí)例介紹
grep "San" testfile
#過(guò)濾有San的行
grep '^J' testfile
#顯示以J開(kāi)頭的行
grep '70$' testfile
#顯示以70結(jié)尾的行
grep -v "834" testfile
#顯示所有不包括834的行
grep ':12/' testfile
#顯示:12/的行
grep ':498-' testfile
#顯示:498-的行
grep '[A-Z][a-z]{4}:[[:space:]][A-Z]' testfile
#顯示這樣的行,一個(gè)大寫(xiě)字母+四個(gè)小寫(xiě)字母+空格+一個(gè)大寫(xiě)字母
grep '[a-z]{1,}[[:space:]][Kk]' testfile
#顯示包括K k的行
grep -n '[0-9]{6,}$' testfile
#顯示6位數(shù)字的行,并打印行號(hào)
grep -i "lincoln" testfile
#顯示有l(wèi)incoln的行,不區(qū)分大小寫(xiě)
Sed實(shí)例介紹
sed 's/Jon/Jonathan/g' testfile
#全局替換(Jon替換成Jonathan)
sed '1,3d' testfile
#刪除文件1-3行
sed -n '5,10p' testfile
#打印文件5-10行內(nèi)容
sed '/Lane/d' testfile
#刪除包包含lane的行
sed -ne '/[1-9]{5}:1[12]/p' testfile
#打印由5個(gè)數(shù)字+:11/12的行
sed 's/^Fred/***&/' testfile
#在以Fred開(kāi)頭的行前加上***
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開(kāi)頭的行打印,然后將“數(shù)字/數(shù)字/數(shù)字”這格式的數(shù)字串替換成 11/14/46
##pattern{n} 匹配模式出現(xiàn)n次。
##pattern{n,} 匹配模式出現(xiàn)最少n次。
##pattern{n,m} 匹配模式出現(xiàn)n到m次之間,n , m為0 - 2 5 5中任意整數(shù)
sed '/^$/d' testfile
#刪除所有空行
sed 's/.$//g'
#刪除以.結(jié)尾行
sed 's/^[][]*//g'
#刪除行首空格
sed 's//.[][]*/[]/g'
#刪除句號(hào)后跟兩個(gè)或更多的空格,用一個(gè)空格代替
sed 's/^.//g'
#刪除第一個(gè)字符
sed 's/COL/(.../)//g'
#刪除緊跟COL的后三個(gè)字符
sed 's/^////g'
#刪除路徑中第一個(gè)/
sed -n '3,/245700/'p testfile
#從第三行開(kāi)始查詢到245700結(jié)束并打印
sed -n '2,26!'p testfile
#打印文件(除2-26)的行
Awk實(shí)例介紹
awk –F : ‘{print $2}’ datafile
#以:分隔打印第二列
awk –F : ‘/^Dan/{print $2}’ datafile
#以:分隔打印以Dan開(kāi)頭行的第二列內(nèi)容
awk –F : ‘/^[CE]/{print $1}’ datafile
#打印以C或E開(kāi)頭行的第一列
awk –F : ‘{if(length($1) == 4) print $1}’ datafile
#打印以:分隔且長(zhǎng)度為4字符的第一列內(nèi)容
awk –F : ‘/[916]/{print $1}’ datafile
#匹配916的行以:分隔打印第一列
awk -F : '/^Vinh/{print "a"$5}' 2.txt
#顯示以Dan開(kāi)頭行并在第五列前加上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
#打印以:分隔且長(zhǎng)度為4字符的第一列內(nèi)容
awk -F : '$1~/Tommy Savage/ {print $5}' 2.txt
awk -F : '($1 == "Tommy Savage") {print $5}' 2.txt
#打印以:分隔且第一列為T(mén)ommy Savage的第五列內(nèi)容
ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
#統(tǒng)計(jì)目錄個(gè)的文件所有的字節(jié)數(shù)
awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'
#以M為單位顯示目錄下的所有字節(jié)數(shù)
awk 'BEGIN{a=10;a+=10;print a}'
20
#a+10等價(jià)于 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
#三目運(yùn)算符?:
awk '/root/{print $0}' passwd
#匹配所有包含root的行
awk -F: '$5~/root/{print $0}' passwd
# 以分號(hào)作為分隔符,匹配第5個(gè)字段是root的行
ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'
#打印IP地址
awk '{print toupper($0)}' test.txt
#toupper是awk內(nèi)置函數(shù),將所小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)
Linux中Awk、Sed、Grep 命令詳解,到這里就介紹完了。
上述內(nèi)容就是Linux中Awk和Sed及Grep命令是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。