基本shell編程【3】- 常用的工具awk\sed\sort\uniq\od,awkuniq
awk
awk是個很好用的東西,大量使用在linux系統分析的結果展示處理上。並且可以使用管道, input | awk '' | output1.首先要知道形式awk 'command' file 如 awk '{print $0}' a.txt b.txt (後面可以跟一個或多個檔案) 2.command學習。command是awk的精髓,其結構為 '條件 {動作} 條件2 {動作2} ……' 2.1關鍵字學習:變數名 含義
ARGC 命令列變元個數
ARGV 命令列變元數組
FILENAME 當前輸入檔案名稱
FNR 當前檔案中的記錄號
FS 輸入欄位分隔字元,預設為一個空格
RS 輸入記錄分隔字元
NF 目前記錄裡域個數
NR 到目前為止記錄數
OFS 輸出域分隔字元
ORS 輸出記錄分隔字元 2.2
條件與
動作。條件包括: BEGIN END 特殊的兩個,代表初始化和掃尾 判斷:如$1 == "abc" $NR == 5 /^tcp/(表示正則匹配) 也可不寫條件,則表示“全匹配”。從這個角度來講 條件本質上是一種篩選規則。 動作: {print NR,NF,$1,$NF,} {if(xxx) xxx; else xxx;} {for(key in array) xxx} 3.執行個體學習:查看機器建立的各串連數netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}' 看每個串連的佔用記憶體byte數---apacheps aux|grep -v grep|awk '/httpd/ {sum+=$6;n++};END{print sum/n}' 根據逗號對abc檔案的每一行進行split,然後按照第二列進行排序,結果輸出到abc-sort中 awk -F, '{print $1}' abc | sort -n -k 2 -t: -r > abc-sort
sort命令解釋:
-n 是按照數字排序
-k 是按照第二列排
-t: 是以:為分隔字元
-r 是倒敘 git查看本次需要提交中變更的內容git diff master HEAD --stat | awk '{printf "%s\n",$1}' |grep domain | awk -F'/' '{printf "%s\n",$NF}' | sort 批量重新命名ls *需要替換* | awk '{org=$0;gsub("需要替換","替換為");system("echo "org" "$0)}' sed
sed用法很多,但是根據上節之中,用來做內容替換最多。
sed -i -e 's/^dubbo_provider_version=.*[^e]$/&-pre/' /home/wuji/webroot-xxx/WEB-INF/classes/biz.properties該命令作用是把 biz.properties中的dubbo_provider_version=1.0.0 替換為dubbo_provider_version=1.0.0-pre 替換的格式為 sed -e ’s/abc/def’ file.txt 把abc替換為def。其中第一部分的正則在第二部分可以被&取到。注意取到的是從dubbo開頭的全部,而不是.*部分,這是Regex的知識。 並且s可以擴充為 舉例2:去掉所有html標籤$ sed -e 's/<[^>]*>//g' myfile.html g的作用:不加只替換第一個匹配,加了會替換所有匹配sed -i 直接替換檔案而不是在螢幕上輸出 學習過vim的朋友們可以輕易的聯想到vim的命令模式,也有:s/abc/def的寫法,所以linux下的知識很多都可以觸類旁通。 uniq
uniq可以去除重複行或者做group by的統計檔案file:aabbb sort file | uniq :ab sort file | uniq -c:2 a3 b 之所以和sort組合是要把所有的a弄到一起,防止b後面有a的情況。uniq -d 只顯示重複的 ,-c只顯示不重複的,兩者互斥。uniq -dc 只顯示重複並統計
sort 功能說明:將文字檔內容加以排序。語 法:sort [-bcdfimMnr][-o<輸出檔案>][-t<分隔字元>][+<起始欄位>-<結束欄位>][--help][--verison][檔案]補充說明:sort可針對文字檔的內容,以行為單位來排序。 執行個體:以第一個關鍵列的第二個字母開始進行排序:$ sort -k 1.2 file.txt以關鍵列第一列的第二個字母進行排序,如果第二個字母相同則根據第三列以數值的標準進行降序排列。$ sort -k 1.2,1.2 -k 3,3nr file.txt -k 排序欄位,按照-t 分隔字元來區分的,從0開始。-n 以數字格式排序。預設string方式比較的話,20和9比較是後者大。-r 反序-d 排序時,處理英文字母、數字及空白字元外,忽略其他的字元。-b 忽略每行前面開始出的空白字元。-u 去除重複行。(
可以利用這個來去重)
sort選項沒特別需要講的,需要注意的就是-k。-k選項的具體文法格式如下:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
這個文法格式可以被其中的逗號(“,”)分為兩大部分,Start部分和End部分。
如果不設定End部分,那麼就認為End被設定為行尾。Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。
我們重點說說Start部分的FStart和C.Start。
C.Start也是可以省略的,省略的話就表示從本域的開頭部分開始。之前例子中的-k 2和-k 3就是省略了C.Start的例子嘍。
FStart.CStart,其中FStart就是表示使用的域,而CStart則表示在FStart域中從第幾個字元開始算“排序首字元”。
同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd,則表示結尾到“域尾”,即本域的最後一個字元。或者,如果你將CEnd設定為0(零),也是表示結尾到“域尾”。
od
od命令是分析檔案內容的工具,很多時候不知道檔案的內容編碼,此時用od命令看檔案內部的位元組構成是最直接的方式,使用方法:od -Ax -tcx4 file 。 可以用於分析字元編碼 是否utf-8 ,是否LE,BE至於如何分辨,還需要瞭解每種編碼的規則,譬如utf-8一般以三個位元組來顯示中文,而gbk則是兩個。