歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux基礎篇之文本、數據流處理命令

Linux基礎篇之文本、數據流處理命令

日期:2017/2/28 14:35:00   编辑:Linux教程

1 awk:文本和數據處理工具

--------------------------------------------------------------------------------
awk擅長於對數據進行分析並生成報告,簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。

使用方法:awk '{pattern + action}' {filenames}

其中pattern 表示awk 在數據中查找的內容,而action是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。pattern就是要表示的正則表達式,用斜槓括起來。准備實例操作文件:netstat -t >> netstat.txt

--------------------------------------------------------------------------------
1.1 打印輸出:print,格式化打印輸出:printf

--------------------------------------------------------------------------------
awk '{print$1, $4}' netstat.txt
awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt


1.2 過濾記錄:awk '$3==0 && $6=="LISTEN"' netstat.txt

--------------------------------------------------------------------------------
其中的“==”為比較運算符。其他比較運算符:!=,>, <, >=, <=
awk '$3>0 {print $0}' netstat.txt
加入表頭:內建變量NR
awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt
再加上格式化輸出

awk '$3 ==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
ps:awk的內建變量
$0
當前記錄(這個變量中存放著整個行的內容)

$1~$n
當前記錄的第n個字段,字段間由FS分隔

FS
輸入字段分隔符默認是空格或Tab

NF
當前記錄中的字段個數,就是有多少列

NR

已經讀出的記錄數,就是行號,從1開始,如果有多個文件話,這個值也是不斷累加中。

FNR
當前記錄數,與NR不同的是,這個值會是各個文件自己的行號

RS
輸入的記錄分隔符,默認為換行符

OFS
輸出字段分隔符,默認也是空格

ORS
輸出的記錄分隔符,默認為換行符

FILENAME
當前輸入文件的名字

輸出行號:awk '$3 ==0 && $6=="ESTABLISHED"|| NR==1 {printf "%02s %s %-20s %-20s %s\n",NR, FNR,$4,$5,$6}' netstat.txt


指定分隔符:awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
或者awk -F: '{print $1,$3,$6}' /etc/passwd
以\t作為分隔符輸出:awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd


1.3 字符串匹配:~表示匹配模式開始,正則表達式匹配。

--------------------------------------------------------------------------------
awk '$6 ~ /TIME/ || NR ==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /ESTABLISHED/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '/LISTEN/' netstat.txt
使用“/TIME|ESTABLISHED/” 來匹配TIME 或者ESTABLISHED :
awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
模式取反:!~
awk '$6 !~ /TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
或者awk '!/WAIT/' netstat.txt


1.4 拆分文件:使用數據流重定向”>”

--------------------------------------------------------------------------------
awk 'NR!=1 {print > $6}' netstat.txt NR!=1表示不處理表頭
把指定的列輸出到文件: awk 'NR!=1{print $4,$5 > $6}' netstat.txt
使用程序流進行條件拆分:if else
awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";
else if($6 ~ /LISTEN/) print > "2.txt";
else print > "3.txt"}' netstat.txt


1.5 統計

--------------------------------------------------------------------------------
計算所有的C文件,CPP文件和H文件的文件大小總和:
ls -l *.cpp *.c*.h | awk '{sum+=$5} END {print sum}'
統計各個connection狀態的用法:使用數組
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt
統計每個用戶的進程的占了多少內存:
ps aux| awk 'NR!=1{a[$1]+=$6;} END { for(i ina) print i ", " a[i]"KB";}'


數組:因為awk中數組的下標可以是數字和字母,數組的下標通常被稱為關鍵字(key)。值和關鍵字都存儲在內部的一張針對key/value應用hash的表格裡。由於hash不是順序存儲,因此在顯示數組內容時會發現,它們並不是按照你預料的順序顯示出來的。數組和變量一樣,都是在使用時自動創建的,awk也同樣會自動判斷其存儲的是數字還是字符串。一般而言,awk中的數組用來從記錄中收集信息,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。


1.6 使用腳本進行文本、數據處理

--------------------------------------------------------------------------------
BEGIN、END關鍵字:BEGIN表示處理所有行之前的標識,END表示處理完所有行後的標識,具體語法:
BEGIN{ 這裡面放的是執行前的語句}
END {這裡面放的是處理完所有的行後要執行的語句}
{這裡面放的是處理每一行時要執行的語句}
實例操作文件:cat cal.awk
#!/bin/awk -f
#運行前
BEGIN {
math= 0
english= 0
computer= 0


printf"NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf"---------------------------------------------\n"
}
#運行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#運行後
END{
printf"---------------------------------------------\n"
printf "TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR,computer/NR
}
執行:awk -f cal.awk score.txt


1.7 變量聲明和環境變量:使用-v參數進行變量聲明,ENVIRON關鍵字表示環境變量

--------------------------------------------------------------------------------
$ x=5
$ y=10
$ export y #y被export為環境變量

$ echo $x $y
5 10
$awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt

Copyright © Linux教程網 All Rights Reserved