linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用...
我們前面已經(jīng)學(xué)習(xí)過(guò) linux的性能查詢(top),以及網(wǎng)絡(luò)端口查詢(netstat)命令等等。
怎么讓我們查詢到的信息按 ? 我們需要的格式 顯示生成。
就是我們本章 需要 學(xué)習(xí)練習(xí)的。
主要是grep,sed,awk3個(gè)命令的運(yùn)用。
grep主要負(fù)責(zé)搜索
sed主要負(fù)責(zé)處理行
awk主要復(fù)雜處理列
我們?cè)谙乱徽碌膬?nèi)容再來(lái)學(xué)習(xí)實(shí)例,如果用這幾個(gè)命令來(lái)進(jìn)行性能監(jiān)控等。
grep
作用
grep命令可以指定文件中搜索特定的內(nèi)容,并將含有這些內(nèi)容的行標(biāo)準(zhǔn)輸出。
grep全稱是Global Regular Expression Print,表示全局正則表達(dá)式版本,它的使用權(quán)限是所有用戶。
格式
grep [options]
[options]主要參數(shù):
-c:只輸出匹配行的計(jì)數(shù)。
-I:不區(qū)分大小寫(xiě)(只適用于單字符)。
-h:查詢多文件時(shí)不顯示文件名。
-l:查詢多文件時(shí)只輸出包含匹配字符的文件名。
-n:顯示匹配行及行號(hào)。
-s:不顯示不存在或無(wú)匹配文本的錯(cuò)誤信息。
-v:顯示不包含匹配文本的所有行。
pattern正則表達(dá)式主要參數(shù):
\:忽略正則表達(dá)式中特殊字符的原有含義。
^:匹配正則表達(dá)式的開(kāi)始行。
$: 匹配正則表達(dá)式的結(jié)束行。
\:到匹配正則表達(dá)式的行結(jié)束。
[ ]:單個(gè)字符,如[A]即A符合要求。
[ - ]:范圍,如[A-Z],即A、B、C一直到Z都符合要求。
。:所有的單個(gè)字符。
* :有字符,長(zhǎng)度可以為0。
\(..\)保存已匹配的字符
正則表達(dá)式是Linux/Unix系統(tǒng)中非常重要的概念。正則表達(dá)式(也稱為“regex”或“regexp”)是一個(gè)可以描述一類字符串的模式(Pattern)。
如果一個(gè)字符串可以用某個(gè)正則表達(dá)式來(lái)描述,我們就說(shuō)這個(gè)字符和該正則表達(dá)式匹配(Match)。
這和DOS中用戶可以使用通配符“*”代表任意字符類似。
在Linux系統(tǒng)上,正則表達(dá)式通常被用來(lái)查找文本的模式,以及對(duì)文本執(zhí)行“搜索-替換”操作和其它功能。
實(shí)例
$ ls -l | grep '^a'
通過(guò)管道過(guò)濾ls -l輸出的內(nèi)容,只顯示以a開(kāi)頭的行。
$ grep 'test' d*
顯示所有以d開(kāi)頭的文件中包含test的行。
$ grep 'test' aa bb cc
顯示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]\{5\}' aa
顯示aa文件中所有包含每個(gè)字符串有5個(gè)連續(xù)小寫(xiě)字符的字符串的行。
$ grep 'w\(es\)t.*\1' aa
如果west被匹配,則es就被存儲(chǔ)到內(nèi)存中,并標(biāo)記為1,然后搜索任意個(gè)字符(.*),這些字符后面緊跟著另外一個(gè)\1 ,\1也就是es,因?yàn)榍懊姘裡s存儲(chǔ)到了內(nèi)存并默認(rèn)標(biāo)記為1了,找到就顯示該行。如果用egrep或grep -E,就不用"\"號(hào)進(jìn)行轉(zhuǎn)義,直接寫(xiě)成'w(es)t.*\1'就可以了。
sed
作用
sed 常常用于一整個(gè)行的處理。sed是一種在線編輯器,它一次處理一行內(nèi)容。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒(méi)有 改變,除非你使用重定向存儲(chǔ)輸出。Sed主要用來(lái)自動(dòng)編輯一個(gè)或多個(gè)文件;簡(jiǎn)化對(duì)文件的反復(fù)操作;編寫(xiě)轉(zhuǎn)換程序等。
格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
[options]主要參數(shù)
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來(lái)自 STDIN 的數(shù)據(jù)一般都會(huì)被列出到終端上。但如果加上 -n 參數(shù)后,則只有經(jīng)過(guò)sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來(lái)。
-e :直接在命令列模式上進(jìn)行 sed 的動(dòng)作編輯;
-f :直接將 sed 的動(dòng)作寫(xiě)在一個(gè)文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)的 sed 動(dòng)作;
-r :sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語(yǔ)法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語(yǔ)法)
-i :直接修改讀取的文件內(nèi)容,而不是輸出到終端。
'command'主要參數(shù)
a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
p :列印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
s :取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦!
pattern正則表達(dá)式主要參數(shù)
^
行首定位符
/^my/ ?匹配所有以my開(kāi)頭的行
$行尾定位符
/my$/ ?匹配所有以my結(jié)尾的行
.匹配除換行符以外的單個(gè)字符
/m..y/ ?匹配包含字母m,后跟兩個(gè)任意字符,再跟字母y的行
*匹配零個(gè)或多個(gè)前導(dǎo)字符
/my*/ ?匹配包含字母m,后跟零個(gè)或多個(gè)y字母的行
[]? 匹配指定字符組內(nèi)的任一字符
/[Mm]y/ ?匹配包含My或my的行
[^]?匹配不在指定字符組內(nèi)的任一字符
/[^Mm]y/ ?匹配包含y,但y之前的那個(gè)字符不是M或m的行
\(..\)? ? ?保存已匹配的字符
1,20s/\(you\)self/\1r/ ?標(biāo)記元字符之間的模式,并將其保存為標(biāo)簽1,之后可以使用\1來(lái)引用它。最多可以定義9個(gè)標(biāo)簽,從左邊開(kāi)始編號(hào),最左邊的是第一個(gè)。此例中,對(duì)第1到第20行進(jìn)行處理,you被保存為標(biāo)簽1,如果發(fā)現(xiàn)youself,則替換為your。
&? ? ?保存查找串以便在替換串中引用
s/my/**&**/ ?符號(hào)&代表查找串。my將被替換為**my**
\
/\
\>? ? ?詞尾定位符
/my\>/ ?匹配包含以my結(jié)尾的單詞的行
x\{m\}連續(xù)m個(gè)x
/9\{5\}/ 匹配包含連續(xù)5個(gè)9的行
x\{m,\} ? ? ?至少m個(gè)x
/9\{5,\}/ ?匹配包含至少連續(xù)5個(gè)9的行
x\{m,n\} ? ? 至少m個(gè),但不超過(guò)n個(gè)
/9\{5,7\}/ ?匹配包含連續(xù)5到7個(gè)9的行
定址
定址用于決定對(duì)哪些行進(jìn)行編輯。地址的形式可以是數(shù)字、正則表達(dá)式、或二者的結(jié)合。如果沒(méi)有指定地址,sed將處理輸入文件的所有行。
地址是一個(gè)數(shù)字,則表示行號(hào);是“$"符號(hào),則表示最后一行。
實(shí)例
刪除d命令
$ sed '2d' example
刪除example文件的第二行。
$ sed '2,$d' example
刪除example文件的第二行到末尾所有行。
$ sed '$d' example
刪除example文件的最后一行。
$ sed '/test/'d example
刪除example文件所有包含test的行。
替換s命令
$ sed 's/test/mytest/g' example
在整行范圍內(nèi)把test替換為mytest。如果沒(méi)有g(shù)標(biāo)記,則只有每行第一個(gè)匹配的test被替換成mytest。
$ sed -n 's/^test/mytest/p' example
(-n)選項(xiàng)和p標(biāo)志一起使用表示只打印那些發(fā)生替換的行。也就是說(shuō),如果某一行開(kāi)頭的test被替換成mytest,就打印它。
$ sed 's/^192.168.0.1/&localhost/' example
&;符號(hào)表示替換換字符串中被找到的部份。所有以192.168.0.1開(kāi)頭的行都會(huì)被替換成它自已加localhost,變成192.168.0.1localhost。
$ sed -n 's/\(love\)able/\1rs/p' example
love被標(biāo)記為1,所有l(wèi)oveable會(huì)被替換成lovers,而且替換的行會(huì)被打印出來(lái)。
$ sed 's#10#100#g' example
不論什么字符,緊跟著s命令的都被認(rèn)為是新的分隔符,所以,“#”在這里是分隔符,代替了默認(rèn)的“/”分隔符。表示把所有10替換成100。
選定行的范圍逗號(hào)
$ sed -n '/test/,/check/p' example
所有在模板test和check所確定的范圍內(nèi)的行都被打印。
$ sed -n '5,/^test/p' example
打印從第五行開(kāi)始到第一個(gè)包含以test開(kāi)始的行之間的所有行。
$ sed '/test/,/check/s/$/sed test/' example
對(duì)于模板test和west之間的行,每行的末尾用字符串sed test替換。
多點(diǎn)編輯e命令
$ sed -e '1,5d' -e 's/test/check/' example
(-e)選項(xiàng)允許在同一行里執(zhí)行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執(zhí)行順序?qū)Y(jié)果有影響。如果兩個(gè)命令都是替換命令,那么第一個(gè)替換命令將影響第二個(gè)替換命令的結(jié)果。
$ sed --expression='s/test/check/' --expression='/love/d' example
一個(gè)比-e更好的命令是--expression。它能給sed表達(dá)式賦值。
從文件讀入r命令
$ sed '/test/r file' example
file里的內(nèi)容被讀進(jìn)來(lái),顯示在與test匹配的行后面,如果匹配多行,則file的內(nèi)容將顯示在所有匹配行的下面。
寫(xiě)入文件w命令
$ sed -n '/test/w file' example
在example中所有包含test的行都被寫(xiě)入file里。
追加命令a命令
$ sed '/^test/a\\this is a test line' example
在example文件中'this is a test line'被追加到以test開(kāi)頭的行后面,sed要求命令a后面有一個(gè)反斜杠。
插入i命令
$ sed '/test/i\\new line-------------------------' example如果test被匹配,則把反斜杠后面的文本插入到匹配行的前面。
下一個(gè)n命令
$ sed '/test/{ n; s/aa/bb/; }' example
如果test被匹配,則移動(dòng)到匹配行的下一行,替換這一行的aa,變?yōu)閎b,并打印該行,然后繼續(xù)。
變形y命令
$ sed '1,10y/abcde/ABCDE/' example
把1--10行內(nèi)所有abcde轉(zhuǎn)變?yōu)榇髮?xiě),注意,正則表達(dá)式元字符不能使用這個(gè)命令。
退出q命令
$ sed '10q' example
打印完第10行后,退出sed。
保持和獲取h命令和G命令
$ sed -e '/test/h' -e '$G example
在sed處理文件的時(shí)候,每一行都被保存在一個(gè)叫模式空間的臨時(shí)緩沖區(qū)中,除非行被刪除或者輸出被取消,否則所有被處理的行都將打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。在這個(gè)例子里,匹配test的行被找到后,將存入模式空間,h命令將其復(fù)制并存入一個(gè)稱為保持緩存區(qū)的特殊緩沖區(qū)內(nèi)。第二條語(yǔ)句的意思是,當(dāng)?shù)竭_(dá)最后一行后,G命令取出保持緩沖區(qū)的行,然后把它放回模式空間中,且追加到現(xiàn)在已經(jīng)存在于模式空間中的行的末尾。在這個(gè)例子中就是追加到最后一行。簡(jiǎn)單來(lái)說(shuō),任何包含test的行都被復(fù)制并追加到該文件的末尾。
保持和互換h命令和x命令
$ sed -e '/test/h' -e '/check/x' example
互換模式空間和保持緩沖區(qū)的內(nèi)容。也就是把包含test與check的行互換。
awk
作用
awk 比較傾向于一行當(dāng)中分成數(shù)個(gè)『欄位』(或者稱為一個(gè)域,也就是一列)來(lái)處理。awk是一個(gè)強(qiáng)大的文本分析工具,相對(duì)于grep的查找,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大。簡(jiǎn)單來(lái)說(shuō)awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行各種分析處理。
awk有3個(gè)不同版本: awk、nawk和gawk,未作特別說(shuō)明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個(gè)字母。實(shí)際上 AWK 的確擁有自己的語(yǔ)言: AWK 程序設(shè)計(jì)語(yǔ)言 , 三位創(chuàng)建者已將它正式定義為“樣式掃描和處理語(yǔ)言”。它允許您創(chuàng)建簡(jiǎn)短的程序,這些程序讀取輸入文件、為數(shù)據(jù)排序、處理數(shù)據(jù)、對(duì)輸入執(zhí)行計(jì)算以及生成報(bào)表,還有無(wú)數(shù)其他的功能。
格式
awk [-F ?field-separator] ?'commands' ?input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開(kāi)的每一項(xiàng)稱為一個(gè)域。通常,在不指名-F域分隔符的情況下,默認(rèn)的域分隔符是空格。
commands
awk的命令非常多,因?yàn)樗踔量梢运闶且粋€(gè)編程語(yǔ)言。我們這里就不詳細(xì)講述了。后面的實(shí)例學(xué)習(xí)中會(huì)了解到一部分常用的命令。
這里大概給出awk中的一些學(xué)習(xí)目錄如下:
print和printf
awk中同時(shí)提供了print和printf兩種打印輸出的函數(shù)。
其中print函數(shù)的參數(shù)可以是變量、數(shù)值或者字符串。字符串必須用雙引號(hào)引用,參數(shù)用逗號(hào)分隔。如果沒(méi)有逗號(hào),參數(shù)就串聯(lián)在一起而無(wú)法區(qū)分。這里,逗號(hào)的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。
printf函數(shù),其用法和c語(yǔ)言中printf基本相似,可以格式化字符串,輸出復(fù)雜時(shí),printf更加好用,代碼更易懂。
awk的環(huán)境變量
變量描述
$n當(dāng)前記錄的第n個(gè)字段,字段間由FS分隔。
$0完整的輸入記錄。
ARGC命令行參數(shù)的數(shù)目。
ARGIND命令行中當(dāng)前文件的位置(從0開(kāi)始算)。
ARGV包含命令行參數(shù)的數(shù)組。
CONVFMT數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)
ENVIRON環(huán)境變量關(guān)聯(lián)數(shù)組。
ERRNO最后一個(gè)系統(tǒng)錯(cuò)誤的描述。
FIELDWIDTHS字段寬度列表(用空格鍵分隔)。
FILENAME當(dāng)前文件名。
FNR同NR,但相對(duì)于當(dāng)前文件。
FS字段分隔符(默認(rèn)是任何空格)。
IGNORECASE如果為真,則進(jìn)行忽略大小寫(xiě)的匹配。
NF當(dāng)前記錄中的字段數(shù)。
NR當(dāng)前記錄數(shù)。
OFMT數(shù)字的輸出格式(默認(rèn)值是%.6g)。
OFS輸出字段分隔符(默認(rèn)值是一個(gè)空格)。
ORS輸出記錄分隔符(默認(rèn)值是一個(gè)換行符)。
RLENGTH由match函數(shù)所匹配的字符串的長(zhǎng)度。
RS記錄分隔符(默認(rèn)是一個(gè)換行符)。
RSTART由match函數(shù)所匹配的字符串的第一個(gè)位置。
SUBSEP數(shù)組下標(biāo)分隔符(默認(rèn)值是\034)。
awk運(yùn)算符
運(yùn)算符 描述
= += -= *= /= %= ^= **=賦值
?:C條件表達(dá)式
||邏輯或
&&邏輯與
~ ~!匹配正則表達(dá)式和不匹配正則表達(dá)式
< <= > >= != ==關(guān)系運(yùn)算符
空格連接
+ -加,減
* / &乘,除與求余
+ - !一元加,減和邏輯非
^ ***求冪
++ --增加或減少,作為前綴或后綴
$字段引用
in數(shù)組成員
專屬正則表達(dá)式元字符
一般通用的元字符集就不講了,可參考我的Sed和Grep。以下幾個(gè)是gawk專用的,不適合unix版本的awk。
\Y
匹配一個(gè)單詞開(kāi)頭或者末尾的空字符串。
\B
匹配單詞內(nèi)的空字符串。
\<
匹配一個(gè)單詞的開(kāi)頭的空字符串,錨定開(kāi)始。
\>
匹配一個(gè)單詞的末尾的空字符串,錨定末尾。
\w
匹配一個(gè)字母數(shù)字組成的單詞。
\W
匹配一個(gè)非字母數(shù)字組成的單詞。
\‘
匹配字符串開(kāi)頭的一個(gè)空字符串。
\'
匹配字符串末尾的一個(gè)空字符串。
awk編程
下面列舉awk編程需要了解的東西:
變量
BEGIN模塊
END模塊
重定向和管道
條件語(yǔ)句
if語(yǔ)句
if/else語(yǔ)句,用于雙重判斷。
if/else else if語(yǔ)句,用于多重判斷。
循環(huán)
數(shù)組
下標(biāo)與關(guān)聯(lián)數(shù)組
awk的內(nèi)建函數(shù)
字符串函數(shù)
時(shí)間函數(shù)
日期和時(shí)間格式說(shuō)明符
內(nèi)建數(shù)學(xué)函數(shù)
自定義函數(shù)
實(shí)例
截取單列
last會(huì)列出最近登錄的情況,僅取出前五行
假設(shè)last -n 5的輸出如下
[root@www ~]# last -n 5
root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in
root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
root tty1 Fri Sep 5 14:09 - 14:10 (00:01)
如果只是顯示最近登錄的5個(gè)帳號(hào) ?也就是第一列
#last -n 5 | awk '{print $1}'
root
root
root
dmtsai
rootawk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域。默認(rèn)域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。
設(shè)置分隔符
默認(rèn)域分隔符是"空白鍵" 或 "[tab]鍵",如果想用其它符合作分隔符,參照下例:
/etc/passwd中是用:分割的
如下:
#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
sys:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin
如果只是顯示/etc/passwd的賬戶
#cat /etc/passwd |awk -F ':' '{print $1}'
root
daemon
bin
sys
-F指定域分隔符為':'。
{print $1}輸出第一列
顯示多行
顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,顯示時(shí)賬戶與shell之間以tab鍵分割
#cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
-F指定域分隔符為':'。
{print $1 "\t" $7} 輸出第一列 ?tab ?和 第7列
使用BEGIN END模塊
顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,而賬戶與shell之間以逗號(hào)分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
#cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
blue,/bin/nosh
awk工作流程是這樣的:先執(zhí)行BEGING,然后讀取文件,讀入有/n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,
$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域
,隨后開(kāi)始執(zhí)行模式所對(duì)應(yīng)的動(dòng)作action。接著開(kāi)始讀入第二條記錄······直到所有的記錄都讀完,最后執(zhí)行END操作。
正則搜索
搜索/etc/passwd里有root關(guān)鍵字的所有行
#awk -F ':' '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash這種是pattern的使用示例,匹配了pattern(這里是root)的行才會(huì)執(zhí)行action(沒(méi)有指定action,默認(rèn)輸出每行的內(nèi)容)。
搜索支持正則,例如找root開(kāi)頭的: awk -F ':' ?'/^root/' /etc/passwd
正則搜索顯示單列
搜索/etc/passwd有root關(guān)鍵字的所有行,并顯示對(duì)應(yīng)的shell ?也就是第7列
# awk -F ':' '/root/{print $7}' /etc/passwd
/bin/bash這里指定了action{print $7}
awk環(huán)境變量的運(yùn)用
我們上面提過(guò)都有哪些環(huán)境變量。
現(xiàn)在我們要統(tǒng)計(jì)/etc/passwd文件中的:文件名,每行的行號(hào),每行的列數(shù)
使用到的變量參數(shù)如下:
FILENAME ? ? ? ? ? awk瀏覽的文件名
NR ? ? ? ? ? ? ? ? 已讀的記錄數(shù) ?也就是第幾行
NF ? ? ? ? ? ? ? ? 瀏覽記錄的域的個(gè)數(shù) ?也就是 共幾列
$0 輸出整行
#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print
printf就是線使用占位符占位,后面再一起傳入?yún)?shù),可以讓代碼更加簡(jiǎn)潔,易讀
awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
自定義變量
統(tǒng)計(jì)/etc/passwd的賬戶人數(shù),每一行是一個(gè)賬戶,因?yàn)閯偤胊wk是逐行遍歷,所以我們自定義一個(gè)count自加就行。
當(dāng)然 定義count為0需要在 awk逐行遍歷之前 ?所以需要用BEGIN模塊。
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is 0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is 40
運(yùn)算
我們需要統(tǒng)計(jì)某個(gè)文件夾下的文件占用的字節(jié)數(shù)
因?yàn)槲募加玫淖止?jié)數(shù) 在 ls -l命令中的第5列
所以我們使用如下命令:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is 8657198
如果以M為單位顯示:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.25889 M注意,統(tǒng)計(jì)不包括文件夾的子目錄。
條件語(yǔ)句
統(tǒng)計(jì)某個(gè)文件夾下不等于4096的其它文件占用的字節(jié)數(shù)-----過(guò)濾4096大小的文件:
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.22339 M
數(shù)組
顯示/etc/passwd的賬戶
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
...... awk編程的內(nèi)容極多,這里只羅列簡(jiǎn)單常用的用法,更多請(qǐng)參考 http://www.gnu.org/software/gawk/manual/gawk.html
總結(jié)
以上是生活随笔為你收集整理的linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 比亚迪驱逐舰05不限里程年限是指电芯还是
- 下一篇: linux命令实验设备,实验二 Linu