日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用...

發(fā)布時間:2024/9/27 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們前面已經(jīng)學(xué)習(xí)過 linux的性能查詢(top),以及網(wǎng)絡(luò)端口查詢(netstat)命令等等。

怎么讓我們查詢到的信息按 ? 我們需要的格式 顯示生成。

就是我們本章 需要 學(xué)習(xí)練習(xí)的。

主要是grep,sed,awk3個命令的運(yùn)用。

grep主要負(fù)責(zé)搜索

sed主要負(fù)責(zé)處理行

awk主要復(fù)雜處理列

我們在下一章的內(nèi)容再來學(xué)習(xí)實(shí)例,如果用這幾個命令來進(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:只輸出匹配行的計數(shù)。

-I:不區(qū)分大小寫(只適用于單字符)。

-h:查詢多文件時不顯示文件名。

-l:查詢多文件時只輸出包含匹配字符的文件名。

-n:顯示匹配行及行號。

-s:不顯示不存在或無匹配文本的錯誤信息。

-v:顯示不包含匹配文本的所有行。

pattern正則表達(dá)式主要參數(shù):

\:忽略正則表達(dá)式中特殊字符的原有含義。

^:匹配正則表達(dá)式的開始行。

$: 匹配正則表達(dá)式的結(jié)束行。

\:到匹配正則表達(dá)式的行結(jié)束。

[ ]:單個字符,如[A]即A符合要求。

[ - ]:范圍,如[A-Z],即A、B、C一直到Z都符合要求。

。:所有的單個字符。

* :有字符,長度可以為0。

\(..\)保存已匹配的字符

正則表達(dá)式是Linux/Unix系統(tǒng)中非常重要的概念。正則表達(dá)式(也稱為“regex”或“regexp”)是一個可以描述一類字符串的模式(Pattern)。

如果一個字符串可以用某個正則表達(dá)式來描述,我們就說這個字符和該正則表達(dá)式匹配(Match)。

這和DOS中用戶可以使用通配符“*”代表任意字符類似。

在Linux系統(tǒng)上,正則表達(dá)式通常被用來查找文本的模式,以及對文本執(zhí)行“搜索-替換”操作和其它功能。

實(shí)例

$ ls -l | grep '^a'

通過管道過濾ls -l輸出的內(nèi)容,只顯示以a開頭的行。

$ grep 'test' d*

顯示所有以d開頭的文件中包含test的行。

$ grep 'test' aa bb cc

顯示在aa,bb,cc文件中匹配test的行。

$ grep '[a-z]\{5\}' aa

顯示aa文件中所有包含每個字符串有5個連續(xù)小寫字符的字符串的行。

$ grep 'w\(es\)t.*\1' aa

如果west被匹配,則es就被存儲到內(nèi)存中,并標(biāo)記為1,然后搜索任意個字符(.*),這些字符后面緊跟著另外一個\1 ,\1也就是es,因?yàn)榍懊姘裡s存儲到了內(nèi)存并默認(rèn)標(biāo)記為1了,找到就顯示該行。如果用egrep或grep -E,就不用"\"號進(jìn)行轉(zhuǎn)義,直接寫成'w(es)t.*\1'就可以了。

sed

作用

sed 常常用于一整個行的處理。sed是一種在線編輯器,它一次處理一行內(nèi)容。處理時,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復(fù)操作;編寫轉(zhuǎn)換程序等。

格式

sed [options] 'command' file(s)

sed [options] -f scriptfile file(s)

[options]主要參數(shù)

-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數(shù)據(jù)一般都會被列出到終端上。但如果加上 -n 參數(shù)后,則只有經(jīng)過sed 特殊處理的那一行(或者動作)才會被列出來。

-e :直接在命令列模式上進(jìn)行 sed 的動作編輯;

-f :直接將 sed 的動作寫在一個文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)的 sed 動作;

-r :sed 的動作支持的是延伸型正規(guī)表示法的語法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語法)

-i :直接修改讀取的文件內(nèi)容,而不是輸出到終端。

'command'主要參數(shù)

a :新增, a 的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的下一行)~

c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!

d :刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;

i :插入, i 的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的上一行);

p :列印,亦即將某個選擇的數(shù)據(jù)印出。通常 p 會與參數(shù) sed -n 一起運(yùn)行~

s :取代,可以直接進(jìn)行取代的工作哩!通常這個 s 的動作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦!

pattern正則表達(dá)式主要參數(shù)

^

行首定位符

/^my/ ?匹配所有以my開頭的行

$行尾定位符

/my$/ ?匹配所有以my結(jié)尾的行

.匹配除換行符以外的單個字符

/m..y/ ?匹配包含字母m,后跟兩個任意字符,再跟字母y的行

*匹配零個或多個前導(dǎo)字符

/my*/ ?匹配包含字母m,后跟零個或多個y字母的行

[]? 匹配指定字符組內(nèi)的任一字符

/[Mm]y/ ?匹配包含My或my的行

[^]?匹配不在指定字符組內(nèi)的任一字符

/[^Mm]y/ ?匹配包含y,但y之前的那個字符不是M或m的行

\(..\)? ? ?保存已匹配的字符

1,20s/\(you\)self/\1r/ ?標(biāo)記元字符之間的模式,并將其保存為標(biāo)簽1,之后可以使用\1來引用它。最多可以定義9個標(biāo)簽,從左邊開始編號,最左邊的是第一個。此例中,對第1到第20行進(jìn)行處理,you被保存為標(biāo)簽1,如果發(fā)現(xiàn)youself,則替換為your。

&? ? ?保存查找串以便在替換串中引用

s/my/**&**/ ?符號&代表查找串。my將被替換為**my**

\

/\

\>? ? ?詞尾定位符

/my\>/ ?匹配包含以my結(jié)尾的單詞的行

x\{m\}連續(xù)m個x

/9\{5\}/ 匹配包含連續(xù)5個9的行

x\{m,\} ? ? ?至少m個x

/9\{5,\}/ ?匹配包含至少連續(xù)5個9的行

x\{m,n\} ? ? 至少m個,但不超過n個

/9\{5,7\}/ ?匹配包含連續(xù)5到7個9的行

定址

定址用于決定對哪些行進(jìn)行編輯。地址的形式可以是數(shù)字、正則表達(dá)式、或二者的結(jié)合。如果沒有指定地址,sed將處理輸入文件的所有行。

地址是一個數(shù)字,則表示行號;是“$"符號,則表示最后一行。

實(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。如果沒有g(shù)標(biāo)記,則只有每行第一個匹配的test被替換成mytest。

$ sed -n 's/^test/mytest/p' example

(-n)選項(xiàng)和p標(biāo)志一起使用表示只打印那些發(fā)生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。

$ sed 's/^192.168.0.1/&localhost/' example

&;符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加localhost,變成192.168.0.1localhost。

$ sed -n 's/\(love\)able/\1rs/p' example

love被標(biāo)記為1,所有l(wèi)oveable會被替換成lovers,而且替換的行會被打印出來。

$ sed 's#10#100#g' example

不論什么字符,緊跟著s命令的都被認(rèn)為是新的分隔符,所以,“#”在這里是分隔符,代替了默認(rèn)的“/”分隔符。表示把所有10替換成100。

選定行的范圍逗號

$ sed -n '/test/,/check/p' example

所有在模板test和check所確定的范圍內(nèi)的行都被打印。

$ sed -n '5,/^test/p' example

打印從第五行開始到第一個包含以test開始的行之間的所有行。

$ sed '/test/,/check/s/$/sed test/' example

對于模板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é)果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結(jié)果。

$ sed --expression='s/test/check/' --expression='/love/d' example

一個比-e更好的命令是--expression。它能給sed表達(dá)式賦值。

從文件讀入r命令

$ sed '/test/r file' example

file里的內(nèi)容被讀進(jìn)來,顯示在與test匹配的行后面,如果匹配多行,則file的內(nèi)容將顯示在所有匹配行的下面。

寫入文件w命令

$ sed -n '/test/w file' example

在example中所有包含test的行都被寫入file里。

追加命令a命令

$ sed '/^test/a\\this is a test line' example

在example文件中'this is a test line'被追加到以test開頭的行后面,sed要求命令a后面有一個反斜杠。

插入i命令

$ sed '/test/i\\new line-------------------------' example如果test被匹配,則把反斜杠后面的文本插入到匹配行的前面。

下一個n命令

$ sed '/test/{ n; s/aa/bb/; }' example

如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變?yōu)閎b,并打印該行,然后繼續(xù)。

變形y命令

$ sed '1,10y/abcde/ABCDE/' example

把1--10行內(nèi)所有abcde轉(zhuǎn)變?yōu)榇髮?#xff0c;注意,正則表達(dá)式元字符不能使用這個命令。

退出q命令

$ sed '10q' example

打印完第10行后,退出sed。

保持和獲取h命令和G命令

$ sed -e '/test/h' -e '$G example

在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩沖區(qū)中,除非行被刪除或者輸出被取消,否則所有被處理的行都將打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。在這個例子里,匹配test的行被找到后,將存入模式空間,h命令將其復(fù)制并存入一個稱為保持緩存區(qū)的特殊緩沖區(qū)內(nèi)。第二條語句的意思是,當(dāng)?shù)竭_(dá)最后一行后,G命令取出保持緩沖區(qū)的行,然后把它放回模式空間中,且追加到現(xiàn)在已經(jīng)存在于模式空間中的行的末尾。在這個例子中就是追加到最后一行。簡單來說,任何包含test的行都被復(fù)制并追加到該文件的末尾。

保持和互換h命令和x命令

$ sed -e '/test/h' -e '/check/x' example

互換模式空間和保持緩沖區(qū)的內(nèi)容。也就是把包含test與check的行互換。

awk

作用

awk 比較傾向于一行當(dāng)中分成數(shù)個『欄位』(或者稱為一個域,也就是一列)來處理。awk是一個強(qiáng)大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數(shù)據(jù)分析并生成報告時,顯得尤為強(qiáng)大。簡單來說awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開的部分再進(jìn)行各種分析處理。

awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實(shí)際上 AWK 的確擁有自己的語言: AWK 程序設(shè)計語言 , 三位創(chuàng)建者已將它正式定義為“樣式掃描和處理語言”。它允許您創(chuàng)建簡短的程序,這些程序讀取輸入文件、為數(shù)據(jù)排序、處理數(shù)據(jù)、對輸入執(zhí)行計算以及生成報表,還有無數(shù)其他的功能。

格式

awk [-F ?field-separator] ?'commands' ?input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。

在awk中,文件的每一行中,由域分隔符分開的每一項(xiàng)稱為一個域。通常,在不指名-F域分隔符的情況下,默認(rèn)的域分隔符是空格。

commands

awk的命令非常多,因?yàn)樗踔量梢运闶且粋€編程語言。我們這里就不詳細(xì)講述了。后面的實(shí)例學(xué)習(xí)中會了解到一部分常用的命令。

這里大概給出awk中的一些學(xué)習(xí)目錄如下:

print和printf

awk中同時提供了print和printf兩種打印輸出的函數(shù)。

其中print函數(shù)的參數(shù)可以是變量、數(shù)值或者字符串。字符串必須用雙引號引用,參數(shù)用逗號分隔。如果沒有逗號,參數(shù)就串聯(lián)在一起而無法區(qū)分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。

printf函數(shù),其用法和c語言中printf基本相似,可以格式化字符串,輸出復(fù)雜時,printf更加好用,代碼更易懂。

awk的環(huán)境變量

變量描述

$n當(dāng)前記錄的第n個字段,字段間由FS分隔。

$0完整的輸入記錄。

ARGC命令行參數(shù)的數(shù)目。

ARGIND命令行中當(dāng)前文件的位置(從0開始算)。

ARGV包含命令行參數(shù)的數(shù)組。

CONVFMT數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)

ENVIRON環(huán)境變量關(guān)聯(lián)數(shù)組。

ERRNO最后一個系統(tǒng)錯誤的描述。

FIELDWIDTHS字段寬度列表(用空格鍵分隔)。

FILENAME當(dāng)前文件名。

FNR同NR,但相對于當(dāng)前文件。

FS字段分隔符(默認(rèn)是任何空格)。

IGNORECASE如果為真,則進(jìn)行忽略大小寫的匹配。

NF當(dāng)前記錄中的字段數(shù)。

NR當(dāng)前記錄數(shù)。

OFMT數(shù)字的輸出格式(默認(rèn)值是%.6g)。

OFS輸出字段分隔符(默認(rèn)值是一個空格)。

ORS輸出記錄分隔符(默認(rèn)值是一個換行符)。

RLENGTH由match函數(shù)所匹配的字符串的長度。

RS記錄分隔符(默認(rèn)是一個換行符)。

RSTART由match函數(shù)所匹配的字符串的第一個位置。

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。以下幾個是gawk專用的,不適合unix版本的awk。

\Y

匹配一個單詞開頭或者末尾的空字符串。

\B

匹配單詞內(nèi)的空字符串。

\<

匹配一個單詞的開頭的空字符串,錨定開始。

\>

匹配一個單詞的末尾的空字符串,錨定末尾。

\w

匹配一個字母數(shù)字組成的單詞。

\W

匹配一個非字母數(shù)字組成的單詞。

\‘

匹配字符串開頭的一個空字符串。

\'

匹配字符串末尾的一個空字符串。

awk編程

下面列舉awk編程需要了解的東西:

變量

BEGIN模塊

END模塊

重定向和管道

條件語句

if語句

if/else語句,用于雙重判斷。

if/else else if語句,用于多重判斷。

循環(huán)

數(shù)組

下標(biāo)與關(guān)聯(lián)數(shù)組

awk的內(nèi)建函數(shù)

字符串函數(shù)

時間函數(shù)

日期和時間格式說明符

內(nèi)建數(shù)學(xué)函數(shù)

自定義函數(shù)

實(shí)例

截取單列

last會列出最近登錄的情況,僅取出前五行

假設(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個帳號 ?也就是第一列

#last -n 5 | awk '{print $1}'

root

root

root

dmtsai

rootawk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。默認(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的賬戶和賬戶對應(yīng)的shell,顯示時賬戶與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的賬戶和賬戶對應(yīng)的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名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表示第一個域,$n表示第n個域

,隨后開始執(zhí)行模式所對應(yīng)的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執(zhí)行END操作。

正則搜索

搜索/etc/passwd里有root關(guān)鍵字的所有行

#awk -F ':' '/root/' /etc/passwd

root:x:0:0:root:/root:/bin/bash這種是pattern的使用示例,匹配了pattern(這里是root)的行才會執(zhí)行action(沒有指定action,默認(rèn)輸出每行的內(nèi)容)。

搜索支持正則,例如找root開頭的: awk -F ':' ?'/^root/' /etc/passwd

正則搜索顯示單列

搜索/etc/passwd有root關(guān)鍵字的所有行,并顯示對應(yīng)的shell ?也就是第7列

# awk -F ':' '/root/{print $7}' /etc/passwd

/bin/bash這里指定了action{print $7}

awk環(huán)境變量的運(yùn)用

我們上面提過都有哪些環(huán)境變量。

現(xiàn)在我們要統(tǒng)計/etc/passwd文件中的:文件名,每行的行號,每行的列數(shù)

使用到的變量參數(shù)如下:

FILENAME ? ? ? ? ? awk瀏覽的文件名

NR ? ? ? ? ? ? ? ? 已讀的記錄數(shù) ?也就是第幾行

NF ? ? ? ? ? ? ? ? 瀏覽記錄的域的個數(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ù),可以讓代碼更加簡潔,易讀

awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

自定義變量

統(tǒng)計/etc/passwd的賬戶人數(shù),每一行是一個賬戶,因?yàn)閯偤胊wk是逐行遍歷,所以我們自定義一個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)計某個文件夾下的文件占用的字節(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)計不包括文件夾的子目錄。

條件語句

統(tǒng)計某個文件夾下不等于4096的其它文件占用的字節(jié)數(shù)-----過濾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)容極多,這里只羅列簡單常用的用法,更多請參考 http://www.gnu.org/software/gawk/manual/gawk.html

總結(jié)

以上是生活随笔為你收集整理的linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。