grep awk sed 实例
文本過濾
5.1正則表達式
一種用來描述文本模式的特殊語法
由普通字符(例如字符a到z)已經特殊字符(稱為元字符,如/、*、?等)組成。
匹配的字符串
文本過濾工具在某種模式下都支持正則表達式
5.2基本元字符集及其含義
字符?????????????????????? 含義
? ^?????????????? 只匹配行首
? $?????????????? 只匹配行尾
? *?????????????? 匹配0個或多個此單字符
? []????????????? 只匹配[]內的字符。可以是一個單字符,也可以是字符序列。
? ??????????? ?可以使用-表示[]內字符序列范圍,如用[1-5]代替[12345]
? \?????????????? 只用來屏蔽一個元字符的特殊含義
? .?????????????? 只匹配任意單字符
pattern\{n\}????? 只用來匹配前面pattern出現的次數,n為次數
pattern\{n,\}???? 只用來匹配前面pattern出現的次數,n為次數,但次數最少為n
pattern\{n,m\}??? 只用來匹配前面pattern出現的次數,n為次數,但pattern出現
??????????????????? 的次數在n與m之間
????????????????????
5.3 句點"."可以匹配任意單字符
...x..x..x
drwxrwxrw-???????????? 不匹配
-rw-rw-rw-???????????? 不匹配
-rwx-wxr-x????????????? 匹配
-rwxrwxrwx????????????? 匹配
....xc....
3452xc63dd???????????? 匹配?
3452xw7134???????????? 不匹配
3452xd6126???????????? 不匹配
3452xc9871???????????? 匹配
3452xc612????????????? 不匹配
5.4^只允許在一行的開始匹配字符或單詞
^
^d
drwxrwxrw-???????????? 匹配
-rw-rw-rw-???????????? 不匹配
-rwx-wxr-x???????????? 不匹配
-rwxrwxrwx???????????? 不匹配
^...1
3451xc63dd???????????? 匹配?
3452xw7134???????????? 不匹配
3452xd6126???????????? 不匹配
3451xc9871???????????? 匹配
5.5 行尾以$匹配字符串或字符
$與^相反,它在行尾匹配字符串或字符,$符號放在匹配單詞后
trouble$? 匹配以單詞trouble結尾的所有字符
^$??????? 匹配空行
^.$?????? 匹配包含一個字符的行
5.6用*匹配單字符或其重復序列
10133*1
匹配
101331
10133921
10133As1
5.7用\屏蔽一個特殊字符
特殊字符
",',||,^,*,+等
\*\.pas
正則表達式中匹配以.*pas結尾的所有字符或文件
5.8用[]匹配一個范圍或集合
逗號將括弧內要匹配的不同字符串分開
用“-”表示一個字符串范圍,表明字符串范圍從"-"左邊字符開始,到"-"右邊字符結束
[012345689]或[0-9]: 假定要匹配任意一個數字
[a-z]:任意小寫字母
[A-Za-z]:任意大、小寫字母
[A-Za-z0-9]:匹配任意字母或數字
[s,S]:匹配大、小寫s
5.9 用\{\}匹配模式結果出現的次數
A\{2\}B:A出現2次,AAB
A\{4,\}B:A最少出現4次,AAAAB,AAAAAB,....
A\{2,4\}B:出現次數范圍2-4次? AAB,AAAB,AAAAB
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}:匹配IP地址
5.10 find命令
一個查找命令
查找具有某些特征文件的命令
可遍歷當前目錄甚至于整個文件系統來查找某些文件或目錄
遍歷大的文件系統時,一般放在后臺執行
find命令的一般形式:
find pathname -options [-print -exec -ok]
pathname find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄
-print find命令將匹配的文件輸出到標準輸出
-exec find命令對匹配的文件執行該參數所給出的shell命令,相應命令的形式為
? 'command'{} \;',注意{}和\;之間的空格
-ok和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell
? 命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
??
5.11 find命令
find命令的一般形式:
-name 按照文件名查找文件
-perm 按照文件權限來查找文件
-user 按照文件屬主來查找文件
-group 按照文件所屬的組來查找文件
-mtime -n +n 按照文件的更改時間來查找文件,-n表示文件更改時間距現在n天以內。
?? +n表示文件更改時間距現在n天之前,find命令還有-atime和-ctime選項,但它們
?? 都和-mtime選項相似
-size n[c]查找文件長度為n快的文件,帶有c是表示文件長度以字節計。
-nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在
-nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在
-newer file1 !file2查找更改時間比文件file1新但比文件file2舊的文件
-type 查找某一類型的文件,諸如:
? b 塊設備文件
? d 目錄
? c 字符設備文件
? p 管道文件
? l 符號鏈接文件
? f 普通文件
??
5.12 find命令舉例
使用name選項
可以使用某種文件名模式來匹配文件,記住要用引號將文件名模式引起來
find -name "*.txt" -print?? 沒有寫路徑表示當前路徑
find ./ -name "*.txt" -print
find ./ -name "[A-Z]*" -print? 會查找子目錄
find /etc -name "host*" -print
使用perm選項
find . -perm 755 -print
使用user和nouser選項
find `pwd` -user root -print
find `pwd` -nouser -print
使用group和nogroup選項
find ./ -group root -print
find ./ -nogroup -print
按照更改時間查找文件
find ./ -mtime -5 -print
find ./ -mtime +3 -print
查找比某個文件新或舊的文件
find `pwd` -newer "tee.txt" ! -newer "parm" -print
比tee.txt新,不parm舊的文件
使用type選項
find .. -type d -print
find .. -type l -print
使用size選項
find . -size +1000000c -print
find . -size +10 -print
使用depth選項
使用find命令時,可能希望先匹配所有的文件,再在子目錄中查找
find / -name "CON.FILE" -depth -print
使用exec或ok來執行shell命令
find . -type f -exec ls -l {} \;
find . -name "*.log" -mtime +5 -ok rm{} \;??
不寫路徑或./或.或`pwd`都表示當前路徑
Xargs
? 在使用find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給
? exec,不幸的是,有些系統對能夠傳遞給exec的命令長度有限制,只有在find命令運行幾分
? 鐘之后,就會出現溢出錯誤,錯誤信息通常是"參數列太長"或"參數列溢出"。這就是xargs命令
? 的用處所在,特別是與find命令一起使用。exec會發起多個進程,而xargs不會多個,只有一個
? find ./ -perm -7 -print |xargs chmod 0-w
? find ./ -type f -print |xargs file
??
5.13 grep介紹
grep是unix和linux中使用最廣泛的命令之一
對文本文件進行模式查找
grep有三種變形
? Grep:標準grep命令
? Egrep:擴展grep,支持基本及擴展的正則表達式
? Fgrep:快速grep
grep一般格式為:
? grep[選項]基本正則表達式[文件]
? 字符串參數最好采用雙引號括,一是以防被誤解為shell命令,二是可以用來查找多個單詞組成
? 的字符串
? -c只輸出匹配行的基數
?-i不區分大小寫(只適應于單字符)
?-h查詢多文件時不顯示文件名
?-H顯示文件名
?-l查詢多文件時只輸出包含匹配字符的文件名
?-n顯示匹配行及行號
?-s不顯示不存在或無匹配文本的錯誤信息
?-v顯示不包含匹配文本的所有行
?
grep "jennu" *.txt
grep "sort it" *
grep -c "OK" echo.sh
grep -i "OK" echo.sh
grep -v "OK" echo.sh
grep -v "OK[0-9]" echo.sh
grep "^[^210]" echo.sh 不是以2、1、0開頭的
grep "H*P" myfile
grep "[5-8][6-9][0-3]" myfile 一個三位數 百位5-8,個位6-9,十位0-3
grep "4\{2\}" myfile?? 包含 44
grep "4\{2,\}" myfile? 至少包含兩個4
grep "4\{2,4\}" myfile 包含2到4個4
grep "^$" myfile? 空行
grep "\?" myfile 包含?
grep "^d" myfile 以d開頭
grep "^[^d]" myfile? 不以d開頭
grep命令類名
?? 類??????????? 等價的正則表達式
[[:upper:]]?????????? [A-Z]
[[:alnum:]]???????? [0-9a-zA-Z]
[[:lower:]]?????????? [a-z]
[[:space:]]????????? 空格或tab鍵
[[:digit:]]?????????? [0-9]
[[:alpha:]]???????? [a-zA-Z]
grep "5[[:degit:]][[:degit:]]" myfile
5.14 awk介紹
可從文件或字符串中基于指定規則瀏覽和抽取信息
是一種自解釋的編程語言
三種方式調用awk
命令行方式:
? awk [-F file-spearator] 'command' input-files
awk腳本
? 所有awk命令插入一個文件,并使awk程序可執行,然后用awk命令解釋器作為腳本的
? 首行,以便通過鍵入腳本名稱來調用它
awk命令插入一個單獨文件
? awk -f awk-script-file input_files
??
awk腳本由各種操作和模式組成
模式和動作
? 模式部分決定動作語句何時觸發及觸發事件(BEGIN,END)
? 動作對數據進行處理,放在大括號{}內知名(print)
分隔符、域和記錄
? awk執行時,其瀏覽域標記為$1,$2...$n。這種方法稱為域標識。$0為所有域
? 注意執行時不要混淆符號$和shell提示符,它們是不同的
awk '{print $0}' awk.log
awk -F : '{print $1}' awk.log
awk '{print $1"\t"$2}' awk.log
awk 'BEGIN {print "IP?????????????????? Date\n----------"} {print $1"\t"$4} END {print "end-of-report"}' awk.log
begin中的是報告頭,end是報告尾
awk中的特殊元字符:+?
awk匹配操作符:~,!~(~表示匹配,!~表示不匹配)
? cat awk.log | awk '$1 ~ /218.9.131.96/'? 匹配218.9.131.96的所有的行
? cat awk.log | awk '$1 !~ /218.9.131.96/'? 不匹配218.9.131.96的所有的行
awk '{if($1=="218.9.131.96")print $0}' awk.log
5.15 sed介紹
sed不與初始化文件打交道,它操作的只是一個拷貝,然后所有的改動沒有重定向到
一個文件,將輸出到屏幕
sed是一種重要的文本過濾工具,使用一行命令或者使用管道與grep與awk相結合
非交互性文本流編輯
調用sed有三種方式
使用sed命令行格式為:
? sed[選項] sed命令 輸入文件
使用sed腳本文件,格式為:
? sed[選項] -f sed腳本文件 輸入文件
sed腳本文件 [選項] 輸入文件
? 不管是使用shell命令行方式或腳本文件方式,如果沒有指定輸入文件,sed從標準輸入
? 中接受輸入,一般是鍵盤或重定向結果
sed命令選項如下:
?n 不打印
?c 下一命令是編輯命令
?f 如果正在調用sed腳本文件
sed在文件中查詢文本的方式
? 使用行號,可以是一個簡單數字,或是一個行號范圍
? 使用正則表達式
??
x??????????????????? x為一行號
x,y????????????????? 表示行號范圍從x到y
/pattern/??????????? 查詢包含模式的行
/pattern/pattern/??? 查詢包含兩個模式的行
pattern/,x?????????? 在給定行號上查詢包含模式的行
x,/pattern/????????? 通過行號和模式查詢匹配行
x,y!???????????????? 查詢不包含指定行號x和y的行
基本sed編輯命令
p?????? 打印匹配行
=?????? 顯示文件行號
a\????? 在定位行號后附加新文件信息
i\????? 在定位行號后插入新文本信息
d?????? 刪除定位行
c\????? 用新文本替換定位文本
s?????? 使用替換模式替換相應模式
r?????? 從另一個文件中讀文本
w?????? 從文本寫一個文件
q?????? 第一個模式匹配完成后推出或立即退出
l?????? 顯示與八進制ASCII代碼等價的控制字符
{}????? 在定位行執行命令組
n?????? 從另一個文件中讀文本下一行,并附加在下一行
g?????? 將模式2粘貼到/pattern n
y?????? 傳送字符
sed '2p' awk.log? 打印第2行的信息? 會打印匹配和不匹配的行
sed -n '2p' awk.log 只打印匹配的行
sed -n '1,3p' awk.log 打印1到3行
sed -n '/url/p' awk.log 打印匹配到url的行
sed -n '14,/url/p' awk.log 從第4行開始查找,直到第一個匹配url的行(不包括第四行)
sed -n '/^$/=' awk.log 打印空行的行號
sed -n -e '/^$/p' -e '/^$/=' awk.log 打印空行及行號
sed -n '/4ddddd/a\huxiaoyi' sed.log? 找到匹配的行,并替換原來的內容
sed -n '/4ddddd/i\huxiaoyi' sed.log? 找到匹配的行,并替換原來的內容
sed -n '/4ddddd/c\huxiaoyi' sed.log? 找到匹配的行,并替換原來的內容
sed '1,2d' sed.log? 刪除1,2行,但是sed.log文件中并沒有真正刪除掉
sed 's/chinaitlab/chinaitlab shenzhen/g' sed.log? 把chinaitlab全部替換為chinaitlab shenzhen
sed -n 's/chinaitlab/&hello/p' sed.log? 在chinaitlab后面追加hello
sed 'lr ctrl.txt' sed.log
sed -n '/china/l' sed.log
5.16 合并與分割
sort [options] files
許多不同的域按不同的列順序分類
-c 測試文件是否已經分類
-m 合并兩個分類文件
-u 刪除所有復制行
-o 存儲sort結果的輸出文件名
-t 域分隔符;用非空格或tab鍵分隔域
+n n為域號,使用此域號開始分類
n 指定分類是域上的數字分類項
-r 比較求逆
sort -c sed.log
sort -u sed.log 合并重復行
sort -r sed.log
sort -t "/" +2 sed.log
sort -t "/" +2n sed.log
unip [option] files
從一個文本文件中去除或禁止重復行
-u 只顯示不重復行
-d 只顯示有重復數據行,每種重復行只顯示其中一行
-c 打印每一重復行出現次數
-f n為數字,前n個域被忽略
unip -c myfile.txt
unip -d myfile.txt
unip -f 2 myfile.txt
unip -d myfile.txt
join [options] file1 file2
用來將來自兩個分類文本文件的行連在一起
-an,n為一數字,用于連接時從文件n中顯示不匹配行
-o n.m,連接域,n為文件號,m為域號。
-j n m,n為文件名,m為域號。使用其他域做連接域
t域分隔符。用來設置非空格或tab鍵的域分隔符。
join -a1 a2 address.txt town
join -o 2.2,1.1 address.txt town
join -j1 1 -j2 1 address town
split 用來將大文件分割成小文件
split命令一般格式:
split -output_file-size input_filename output_filename
-b n,每個分隔文件的大小n(k,m)
-C n,每個分隔文件一行最多n個字節
-l n,每個分隔文件的行數
-n,同-l n
split -10 ls_out.txt split
cut用來從標準輸入或文本文件中剪切列或域
parte 將按行將不同文件信息放在一行
總結
以上是生活随笔為你收集整理的grep awk sed 实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sed、awk、xargs正则表达式
- 下一篇: linux 的重定向、管道、xargs