日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、前言

linux 有很多工具可以做文本處理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, head, tail.....,學習 linux 文本處理的懶惰方式(不是最好的方法)可能是:只學習grep,sed和awk。 使用這三個工具,你可以解決近 99% linux 系統的文本處理問題,而不需要記住上面不同的命令和參數。:)

而且,如果你已經學會并使用了三者,你就會知道其中的差異。實際上,這里的差異意味著哪個工具擅長解決什么樣的問題。

一種更懶惰的方式可能是學習腳本語言(Python,perl或ruby)并使用它進行每個文本處理。

二、概述

awk、grep、sed 是 linux 操作文本的三大利器,也是必須掌握的 linux 命令之一。三者的功能都是處理文本,但側重點各不相同,其中屬 awk 功能最強大,但也最復雜。grep 更適合單純地查找或匹配文本,sed 更適合編輯匹配到的文本,awk 更適合格式化文本,對文本進行較復雜格式處理。

簡單概括:

  • grep:數據查找定位
  • awk:數據切片
  • sed:數據修改

三、grep = global regular expression print

用最簡單術語來說,grep(全局正則表達式打印)--命令用于查找文件里符合條件的字符串。 從文件的第一行開始,grep 將一行復制到 buffer 中,將其與搜索字符串進行比較,如果比較通過,則將該行打印到屏幕上。grep將重復這個過程,直到文件搜索所有行。

注意這里沒有進程執行 grep 存儲行、更改行或僅搜索部分行。

1、示例數據文件

請將以下數據剪切粘貼到一個名為 “sampler.log” 的文件中:

boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots

2、一個簡單例子

grep 最簡單的例子是:

grep "boo" sampler.log 

在本例中,grep 將遍歷文件 “sampler.log” 的每一行,并打印出其中的每一行 包含單詞“boo”:

boot
book
booze
boots

但是如果你操作的是大型文件,就會出現這種情況:如果這些行標識了文件中的哪一行,它們是什么,可能對你更有用,如果需要在編輯器中打開文件,那么可以更容易地跟蹤特定字符串做一些改變。 這時候可以通過添加 -n 參數來實現:

grep -n "boo" sampler.log

這產生了一個更有用的結果,解釋了哪些行與搜索字符串匹配:

1:boot
2:book
3:booze
5:boots

另一個有趣的參數是 -v,它會打印出相反的結果。換句話說,grep 將打印所有與搜索字符串不匹配的行,而不是打印與之匹配的行。

在下列情況下,grep 將打印不包含字符串 “boo” 的每一行,并顯示行號,如上一個例子所示

grep -vn "boo" sampler.log 
4:machine
6:bungie
7:bark
8:aardvark
9:broken$tuff
10:robots

c 選項告訴 grep 抑制匹配行的打印,只顯示匹配行的數量,匹配查詢的行。

例如,下面將打印數字4,因為有4個在 sampler.log 中出現 “boo”。

grep -c "boo" sampler.log 
4

l 選項只打印查詢中具有與搜索匹配行的文件的文件名字符串。 如果你想在多個文件中搜索相同的字符串,這將非常有用。像這樣:

grep -l "boo" *

對于搜索非代碼文件,一個更有用的選項是 -i,忽略大小寫。這個選項將處理在匹配搜索字符串時,大小寫相等。 在下面的例子中,即使搜索字符串是大寫的,包含“boo”的行也會被打印出來。

grep -i "BOO" sampler.log 
boot
book
booze
boots

x 選項只精確匹配。換句話說,以下命令搜索沒有結果,因為沒有一行只包含"boo"

grep -x "boo" sampler.log 

最后,-A 允許你指定額外的上下文件行,這樣就得到了搜索字符串額外行,例如

grep -A2 "mach" sampler.log
machine
boots
bungie

3、正則表達式

正則表達式是描述文本中復雜模式的一種緊湊方式。有了 grep 你可以使用搜索模式( pattern ) 。其他工具使用正則表達式 (regexp) 以復雜的方式。

而 grep 使用的普通字符串,實際上非常簡單正則表達式。如果您使用通配符,如 ' * ' 或 ' ? ',比如列出文件名等,你可以使用 grep 使用基本的正則表達式進行搜索 例如搜索文件以字母 e 結尾的行:

grep "e$" sampler.log 
booze
machine
bungie

如果需要更廣泛的正則表達式命令,則必須使用grep -E。 例如,正則表達式命令 ? 將匹配1或0次出現 之前的字符:

grep -E "boots?" sampler.log 
boot
boots

你還可以使用 pipe(|) 結合多個搜索,它的意思是 “或者”,所以你可以這樣做:

grep -E "boot|boots" sampler.log 
boot
boots

4、特殊字符

如果你想搜索的是一個特殊字符,該怎么辦?如果你想找到所有的直線,如果包含美元字符“$”,則不能執行 grep “ $ ” a_file,因為 '$' 將被解釋為正則表達式,相反,你將得到所有的行,其中有任何作為行結束,即所有行。 解決方案是 “轉義” 符號,所以您將使用

grep '$' sampler.log 
broken$tuff

你還可以使用 “-F” 選項,它代表“固定字符串”或“快速”,因為它只搜索字符串,而不是正則表達式。

5、更多的 regexp 的例子

參考:

四、AWK

由 Aho,Weinberger 和 Kernighan 創建的文本模式掃描和處理語言。 AWK非常復雜,所以這不是一個完整的指南,但應該給你一個知道什么 awk 可以做。它使用起來比較簡單,強烈建議使用。

1、AWK 基礎知識

awk 程序對輸入文件的每一行進行操作。它可以有一個可選的 BEGIN{ } 部分 在處理文件的任何內容之前執行的命令,然后主{ }部分運行在文件的每一行中,最后還有一個可選的END{ }部分操作將在后面執行文件讀取完成:

BEGIN { …. initialization awk commands …}
{ …. awk commands for each line of the file…}
END { …. finalization awk commands …}

對于輸入文件的每一行,它會查看是否有任何模式匹配指令,在這種情況下它僅在與該模式匹配的行上運行,否則它在所有行上運行。 這些 'pattern-matching' 命令可以包含與 grep 一樣的正則表達式。 a

wk 命令可以做一些非常復雜的數學和字符串操作,awk也支持關聯陣列。 AWK 將每條線視為由多個字段組成,每個字段由“間隔符”分隔。 默認情況下,這是一個或多個空格字符,因此行:

this is a line of text

包含6個字段。在 awk 中,第一個字段稱為 2,等等,全部行稱為 $0。 字段分隔符由 awk 內部變量 FS 設置,因此如果您設置 FS= ": "則它將根據 ':' 的位置劃分一行,這對于/etc/passwd 之類的文件很有用,其他有用的內部變量是 NR,即當前記錄號(即行號) NF是當前行中字段的數量。

AWK 可以對任何文件進行操作,包括 std-in,在這種情況下,它通常與 '|' 命令一起使用,例如,結合 grep 或其他命令。 例如,如果我列出當前目錄中的所有文件

ls -l
總用量 140
-rw-r--r-- 1 root root 55121 1月   3 17:03 combined_log_format.log
-rw-r--r-- 1 root root 80644 1月   3 17:03 combined_log_format_w_resp_time.log
-rw-r--r-- 1 root root    71 1月   3 17:55 sampler.log

我可以看到文件大小報告為3 列數據。如果我想知道它們的總大小,這個目錄中的文件我可以做:

ls -l | awk 'BEGIN {sum=0} {sum=sum+$5} END {print sum}'
135836

請注意,'print sum' 打印變量 sum 的值,因此如果 sum = 2 則 'print sum' 給出輸出 '2' 而 'print $ sum' 將打印 '1' ,因為第二個字段包含值 '1' 。

因此,會很簡單編寫一個可以計算平均值的和一列數字的標準偏差的 awk 命令 - 在主要內部積累 'sum_x' 和 'sum_x2' 部分,然后使用標準公式計算 END 部分的平均值和標準偏差。 AWK 支持('for' 和 'while')循環和分支(使用 'if ')。

所以,如果你想修剪一個文件并且只在每個第 3 行操作,你可以這樣做:

ls -l | awk '{for (i=1;i<3;i++) {getline}; print NR,$0}'
3 -rw-r--r-- 1 root root 80644 1月   3 17:03 combined_log_format_w_resp_time.log
4 -rw-r--r-- 1 root root    71 1月   3 17:55 sampler.log

for 循環使用 “getline” 命令遍歷文件,并且每隔3次才打印一行。注意,由于文件的行數是4,不能被3整除,所以最后一個命令提前完成,所以最后的 “print $0” 命令打印第4行,你可以看到我們也打印了行,使用 NR 變量輸出行號。

2、AWK 模式匹配

AWK 是一種面向行的語言。首先是模式,然后是動作。 操作語句用{ and }括起來。模式可能缺失,或者動作可能缺失,但是,當然不是都。 如果缺少模式,則對每個輸入記錄執行操作。一個丟失的動作將打印整個記錄。

AWK 模式包括正則表達式(使用與“grep -E”相同的語法)和使用的組合特殊符號 “&&” 表示“邏輯AND ”,“||”表示“邏輯或”,“!” 的意思是“邏輯不”。 你也可以做關系模式、模式組、范圍等。

3、AWK 控制語句

if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
exit [ expression ]

4、AWK 輸入/輸出語句

Linux三劍客awk、grep、sed詳解

 

注意:printf 命令允許你使用類似 C 的語法更密切地指定輸出格式 例如,你可以指定給定寬度的整數,浮點數或字符串等。

5、AWK 數學函數

Linux三劍客awk、grep、sed詳解

 

6、AWK 字符串函數

Linux三劍客awk、grep、sed詳解

 

7、AWK 命令行和用法

你可以根據需要多次使用 ' -v ' 標志將變量傳遞給 awk 程序,例如

awk -v skip=3 '{for (i=1;i<skip;i++) {getline}; print $0}' sampler.log 
booze
bungie
broken$tuff

你還可以使用編輯器編寫 awk 程序,然后將其另存為腳本文件,例如:

$ cat awk_strip
#!/usr/bin/awk -f
#only print out every 3rd line of input file
BEGIN {skip=3}
{for (i=1;i<skip;i++)
 {getline};
print $0}

然后可以將其用作新的附加命令

chmod u+x awk_strip
./awk_strip sampler.dat

五、sed = stream editor

sed 對輸入流(文件或來自管道的輸入)執行基本文本轉換單通過流,所以效率很高。 但是, sed 能夠管道過濾文本,特別區別于其他類型的編輯器。

1、sed 基礎

sed 可以在命令行或 shel l腳本中使用,以非交互方式編輯文件。 也許最有用的功能是對一個字符串進行 “搜索和替換” 到另一個字符串。

您可以將 sed 命令嵌入到使用 '-e' 選項調用 sed 的命令行中,或者將它們放在一個單獨的文件中 'sed.in' 并使用 '-f sed.in' 選項調用 sed。 后一種選擇是如果 sed 命令很復雜并涉及大量regexp,則最常用! 例如:

sed -e 's/input/output/' sampler.log 
boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots

將從 sampler.log 回顯到標準輸出的每一行,改變每一行的 'input' 排成 'output'。 注意 sed 是面向行的,所以如果你想改變每一行的每一個事件,那么你需要讓它成為一個 '貪婪' 的搜索和替換,如下所示:

sed -e 's/input/output/g' sampler.log 
boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots

/.../ 中的表達式可以是文字字符串或正則表達式。 注意默認情況下,輸出將寫入 stdout。 你可以將其重定向到新文件,或者如果你愿意 編輯現有文件,你應該使用 '-i' 標志:

sed -e 's/input/output/' sampler.log  > new_file
sed -i -e 's/input/output/' sampler.log  

2、sed 和正則表達式

如果你希望在搜索命令中使用的某個字符是特殊符號,例如 '/',該怎么辦?(例如在文件名中)或 '*' 等? 然后你必須像 grep(和awk)那樣轉義符號。 跟你說想要編輯shell腳本以引用 /usr/local/bin而不是 /bin,那么你可以這樣做

sed -e 's//bin//usr/local/bin/' my_script > new_script

如果你想在搜索中使用通配符怎么辦 - 如何編寫輸出字符串? 你需要使用與找到的模式對應的特殊符號“&”。 所以說你想要每行以你的文件中的數字開頭,并用括號括起該數字:

sed -e 's/[0-9]*/(&)/' 

其中 [0-9] 是所有個位數的 regexp 范圍,而 '*' 是重復計數,表示任何數字的位數。 你還可以在 regexp 中使用位置指令,甚至可以將部分匹配結果保存在模式緩沖區,以便在其他地方重用。

六、其它 SED 命令

一般形式是

sed -e '/pattern/ command' sampler.log

其中 'pattern' 是正則表達式,'command' 可以是 's'= search&replace,或 'p'= print,或 'd'= delete,或 'i'=insert,或 'a'=Append 等。

請注意,默認操作是打印所有不是無論如何匹配,所以如果你想抑制它,你需要使用 '-n' 標志調用 sed,然后你可以使用 'p' 命令來控制打印的內容。

所以,如果你想做一個所有的列表 你可以使用的子目錄

ls -l | sed -n -e '/^d/ p'

因為長列表開始每行都帶有 'd' 符號,如果它是一個目錄,所以這只會打印出來那些以 'd' 符號開頭的行。 同樣,如果你想刪除所有以評論符號 '#' 開頭的行,你可以使用

sed -e '/^#/ d' sampler.log

也可以使用范圍表單

sed -e '1,100 command' sampler.log

在第1-100 行執行“命令”。你也可以用特殊的行號 $ 來表示“結束”文件。 因此,如果你想刪除文件的前10行以外的所有行,您可以使用

sed -e '11,$ d' sampler.log

你還可以使用模式范圍表單,其中第一個正則表達式定義范圍的開始,以及第二次停止。 所以,例如,如果你想打印從 'boot' 到 'machine' 的所有行 你可以這樣做:

sed -n -e '/boot$/,/mach/p' sampler.log
boot
book
booze
machine

然后只打印出(-n)regexp 給定的給定范圍內的那些行。

1、延伸閱讀

使用 sed 可以做的事情還有很多 ,具體參考:http://www.grymoire.com/Unix/Sed.html

七、總結

Linux 三劍客 awk,sed和grep 在性能領域廣泛用于性能建模、性能監控及性能分析等方面,也是各大互聯網公司測試崗高頻面試題,中高端測試人員必備技能之一。

分享到:
標簽:Linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定