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

Linux三劍客Awk命令詳解

命令名稱php

Awk  pattern scanning and processing language

命令做用html

對文本和數據進行處理linux

詳細說明正則表達式

awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸(stdin)、一個或多個文件,或其它命令的輸出。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。express

語法格式編程

awk [options] 'scripts' var=value filename

經常使用參數centos

  • -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經常使用實例

一、替換操做

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

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結尾的行

經常使用實例

一、在多個文件中查找:

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 命令詳解,到這裏就介紹完了。歡迎評論、點贊、轉發分享支持。

注:未經受權,禁止任何方式的轉載。
image

相關文章
相關標籤/搜索