文本利器AWK
awk 是一個強大的文本分析工具,相對于 grep 的查找,sed 的編輯,awk 在其對數據分析并生成報告時,顯得尤為強大。簡單來說 awk 就是把文件 逐行 的讀入,以 空格 為默認分隔符將每行切片,切開的部分再進行各種分析處理。
基本的語法是
awk 'BEGIN{ print something} pattern {commands} \
END{print something}' file AWK BEGIN用法
$ echo -e "line1\nline2" | awk 'BEGIN{ print "start"} { print } \
END { print "END" }'
start
line1
line2
END 特殊變量
$ echo -e "line1 f2 f3 \n line2 f4 f5\n line3 f6 f7" | awk '{
print "Line no:"NR",No of fields:"NF, "$0="$0, "$1="$1,"$2="$2, "$3="$3 }'
Line no:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line no:2, No of fields:3 $0= line2 f4 f5 $1=line2 $2=f4 $3=f5
Line no:3, No of fields:3 $0= line3 f6 f7 $1=line3 $2=f6 $3=f7 NR:當前行號
NF:當前行字段數量
$ seq 5 | awk 'BEGIN { getline;print "Read ahead first line", $0} \
{print $0}'
Read ahead first line 1
2
3
4
5 $0:當前行內容
$1:當前行第一個字段內容
$2:當前行第二個字段內容
Shell 自帶的還有其他的一些特殊變量
$0 這個程式的執行名字 $n 這個程式的第n個參數值,n=1..9 $* 這個程式的所有參數,此選項參數可超過9個。 $# 這個程式的參數個數 $$ 這個程式的PID(腳本運行的當前進程ID號) $! 執行上一個背景指令的PID(后臺運行的最后一個進程的進程ID號) $? 執行上一個指令的返回值 (顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤) $- 顯示shell使用的當前選項,與set命令功能相同 $@ 跟$*類似,但是可以當作數組用
設置字段定界符
$ awk 'BEGIN { FS=":" }{print $NF}' /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync 從 awk 中讀取命令的輸出
$ echo | awk '{ "grep root /etc/passwd" | getline cmdout; print cmdout }'
root:x:0:0:root:/root:/bin/bash 單詞計數
#!/bin/bash
if [ $# -ne 1 ];
then
echo "Usage: $0 filename";
exit -1
fi
filename=$1
egrep -o "\b[a-zA-Z]+\b" $filename | \
awk '{ count[$0]++ }
END{ printf("%-14s%s\n", "word", "count");
for(ind in count)
{ printf("%-14s%d\n", ind, count[ind]); }
}' egrep -o這一行將文本中每一個單詞單獨作一行輸出,為了下面解析方便。
awk 對每行的一個單詞計數,主要是利用關聯數組的特性,使用count[$0]++來存儲 Key-Value 計數。
輸出如下:
word count dfs 1 gds 2
文件去重
#!/bin/bash
ls -lS --time-style=long-iso | awk 'BEGIN {
getline; getline;
name1=$8; size=$5
}
{
name2=$8;
if ( size==$5 )
{
"md5sum "name1 | getline; csum1=$1;
"md5sum "name2 | getline; csum2=$1;
if ( csum1==csum2)
{
print name1; print name2
}
};
size=$5; name1=name2;
}' | sort -u > duplicate_files
cat duplicate_files | xargs -I {} md5sum {} | sort | uniq -w 32 |\
awk '{ print
"^"$2"$" }' | sort -u > duplicate_sample
echo Removing
comm duplicate_files duplicate_sample -2 -3 | tee /dev/stderr | xargs rm
echo Removed duplicates files successfully. 這段代碼用來對文件進行去重。
BEGIN 后的代碼z只執行一次,去掉第一行計數。
total 1068 -rw-r--r-- 1 huangyi huangyi 1048576 2015-11-15 10:44 junk.data -rw-rw-rw- 1 huangyi huangyi 761 2015-11-15 18:32 remove_duplicates.sh -rw-r--r-- 1 huangyi huangyi 79 2015-11-15 17:39 duplicate_sample
name1 存儲第八列的文件名,size 存儲第五列的文件大小。
接下來的代碼對比相近兩行的 md5 值來判斷文件是否相同。
size=$5; name1=name2;用來更新比較行。
duplicate_files 存儲的是有重復的文件。
Github push 自動化腳本
#!/bin/bash
modified_files=`git status | awk ' /modified:/ {print $2}'`
git add $modified_files
git status
git commit -m "commit from tool"
git push origin master 一般對文件比較多的操作就是修改,因此可以用此腳本 push 到 Github 上。
awk 找出修改文件的路徑,多個文件的路徑會用空格隔開。
參考
https://www.gnu.org/software/gawk/manual/html_node/Using-BEGIN_002fEND.html
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!