勿(誤)入逐行處理怪圈膝蜈,關(guān)鍵字段落(shell锅移,awk)

今天有個請求熔掺,想知道AIX TL升級后fileset的版本升級信息,就是從什么升到了什么非剃。
AIX方面有個方法去查看這個升級歷史瞬女,就是lslpp -h,結(jié)果加工過后如下(后來發(fā)現(xiàn)做了多余的加工)

filesetA
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetB
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/89
filesetC
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetD
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/89
filesetCA
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetCB
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetCD
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/89
filesetC9
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetDE
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetZP
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/89
filesetCW
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetCX
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetMQ
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/89
filesetPO
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/89
filesetYT
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetV
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88
filesetX
        1.0 2/13/77
        1.1 29/2/00
        1.2 8/8/88

我要找出8/8/89這個日期的段落努潘,然后版本升級前后來個可讀性增強
例如
filesetB 1.1->1.2

花了兩個小時,之前一小時花費在如何逐行判斷哪個是標題坤学,哪個是版本信息的怪圈里
然后發(fā)現(xiàn)這樣的邏輯分支太多了疯坤,簡直是自找麻煩
舉個例子,我就懶得寫了深浮,寫個大概

cat filename|while read LINE
do
if 標題的正則 $LINE压怠;then
清空臨時文件(cat /dev/null>tempfile)
titlename=“巴拉巴拉”
else
if 版本信息為空;then
versioninfo=“巴拉巴拉”
else
versioninfo="$versioninfo換行符$versioninfo"
fi
打印信息到臨時文件
unset 利用的變量(要判斷是否已有變量)
fi
done

所以就放棄了,之前弄過一個段落截取的函數(shù)飞苇,思維就開闊了菌瘫,即把標題的行數(shù)裝入數(shù)組,通過數(shù)組之間的元素弄出每個段落

[vagrant@amainst perltest]$ fileset_ck () {
> filename=$1
> keyword=$2
> list=(`grep -n ^[a-zA-Z] $filename|awk -F':' '{print $1}'`)
> i=0
> endnum=`echo ${#list[@]}`
> ubound=`expr $endnum - 1`
> while [ $i -le $ubound ]
> do
> if [ $i -eq $ubound ];then
> sed -n "${list[$i]},$"p $filename>tempfile
> else
> nextline=`expr $i + 1`
> sed -n "${list[$i]},${list[$nextline]}"p $filename|head -n -1>tempfile
> fi
> if grep -q $keyword tempfile;then
> filesetname=`head -1 tempfile`
> oldversion=`tail -2 tempfile|head -n -1|awk '{print $1}'`
> newversion=`tail -1 tempfile|awk '{print $1}'`
> echo -e "$filesetname\t$oldversion->$newversion"
> fi
> i=`expr $i + 1`
> done
> unset filename keyword listi filesetname oldversion newversion
> }
[vagrant@amainst perltest]$ time fileset_ck testfile 89
filesetB        1.1->1.2
filesetD        1.1->1.2
filesetCD       1.1->1.2
filesetZP       1.1->1.2
filesetMQ       1.1->1.2
filesetPO       1.1->1.2

real    0m0.117s
user    0m0.059s
sys     0m0.056s

看到這里請注意2伎āS耆谩!7薜取F苤摇!以上都是在浪費時間贸街,再經(jīng)過冷靜思考以后我想起aix的grep是有關(guān)鍵字段落的參數(shù)的庵寞,那就grep -p 關(guān)鍵字
但是我現(xiàn)在用的是centos來寫記錄這些體驗,centos(一切l(wèi)inux發(fā)行版)怎么弄段落呢薛匪?
那就是awk中對于RS這個保留字的理解捐川,RS是記錄的分隔符。
以下是命令

以下命令有點長
首先管道sed把首字符為英文的行前插入兩個空行逸尖,這樣好處理段落(其實數(shù)據(jù)本來就是段落古沥,我還特意把空行刪掉了)
然后awk BEGIN語句里對awk進行一個記錄分隔符的設(shè)定(RS="\n\n")就是兩個空行前的數(shù)據(jù)為一個記錄
[vagrant@amainst perltest]$ time cat testfile|sed '/^[a-zA-Z]/i\\n'|awk 'BEGIN{RS="\n\n"}
> /89/{sub("\n","",$0)#這里匹配關(guān)鍵字89,因為我要找的數(shù)據(jù)是這個冷溶,其實不夠嚴謹渐白,但目前數(shù)據(jù)源沒有多余的數(shù)據(jù)干擾。
> ubound=split($0,info,"\n")#變量=split這種方法之前的文章有提到逞频,就是找出split出來的數(shù)組的長度纯衍。
> print info[1]"\t"info[ubound-1]" -> "info[ubound]}'|awk 'BEGIN{OFS="\t"}{NF=NF;$NF=$(NF-3)="";print}'
#最后一個管道是因為懶得在前一個awk管道處理了,就放到這里來
filesetB        1.1             ->      1.2
filesetD        1.1             ->      1.2
filesetCD       1.1             ->      1.2
filesetZP       1.1             ->      1.2
filesetMQ       1.1             ->      1.2
filesetPO       1.1             ->      1.2

real    0m0.005s#主要看這里的視角消耗苗胀,比前一個shell快多了
user    0m0.004s
sys     0m0.001s

為什么awk的方法要比shell快

對于性能的問題襟诸,最好都去研究一下時間復(fù)雜度的問題瓦堵。(老實說我自己也解釋不清楚)
以下是初淺理解

[vagrant@amainst perltest]$ echo ${#list[@]}
17
shell數(shù)組的長度是17,時間復(fù)雜度來看歌亲,里面只有一個循環(huán)菇用,應(yīng)該是O(n),即O(17)
[vagrant@amainst perltest]$ cat testfile|sed '/^[a-zA-Z]/i\\n'|awk 'BEGIN{RS=OFS="\n\n"}{print NR}'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
awk的記錄比shell還多一個陷揪,哈哈惋鸥,即O(18)
[vagrant@amainst perltest]$ cat testfile|sed '/^[a-zA-Z]/i\\n'|awk 'BEGIN{RS=OFS="\n\n"}/89/{print NR}'
3
5
8
11
14
15
但是匹配關(guān)鍵字后記錄只有6,即O(6)悍缠,那是不是快在這里呢卦绣?

花了一天時間,不得不說shell寫法不僅耗時久(寫的也久飞蚓,語法的符號用多了還容易出語法錯誤)滤港。

推薦如果會awk,多花時間學(xué)習趴拧,書寫效率和執(zhí)行效率都要比shell快溅漾。

最后,用shell也千萬不要用逐行循環(huán)

[vagrant@amainst perltest]$ wc -l testfile
68 testfile

以上著榴,程序要處理68行數(shù)據(jù)添履,即O(68),執(zhí)行效率可想而知脑又。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缝龄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挂谍,更是在濱河造成了極大的恐慌叔壤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件口叙,死亡現(xiàn)場離奇詭異炼绘,居然都是意外死亡,警方通過查閱死者的電腦和手機妄田,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門俺亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疟呐,你說我怎么就攤上這事脚曾。” “怎么了启具?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵本讥,是天一觀的道長。 經(jīng)常有香客問我,道長拷沸,這世上最難降的妖魔是什么色查? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮撞芍,結(jié)果婚禮上秧了,老公的妹妹穿的比我還像新娘。我一直安慰自己序无,他們只是感情好验毡,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帝嗡,像睡著了一般米罚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丈探,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音拔莱,去河邊找鬼碗降。 笑死,一個胖子當著我的面吹牛塘秦,可吹牛的內(nèi)容都是我干的讼渊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼尊剔,長吁一口氣:“原來是場噩夢啊……” “哼爪幻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起须误,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挨稿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后京痢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奶甘,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年祭椰,在試婚紗的時候發(fā)現(xiàn)自己被綠了臭家。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡方淤,死狀恐怖钉赁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情携茂,我是刑警寧澤你踩,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響姓蜂,放射性物質(zhì)發(fā)生泄漏按厘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一钱慢、第九天 我趴在偏房一處隱蔽的房頂上張望逮京。 院中可真熱鬧,春花似錦束莫、人聲如沸懒棉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽策严。三九已至,卻和暖如春饿敲,著一層夾襖步出監(jiān)牢的瞬間妻导,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工怀各, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倔韭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓瓢对,卻偏偏與公主長得像寿酌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硕蛹,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 系統(tǒng)巡檢腳本:Version 2016.08.09 ############################ 系統(tǒng)...
    NamasAmitabha閱讀 1,316評論 0 0
  • 轉(zhuǎn)載 原文的排版和內(nèi)容都更加友好,并且詳細,我只是在這里貼出了一部分留作自己以后參考和學(xué)習,如希望更詳細了解AWK...
    XKirk閱讀 3,219評論 2 25
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,168評論 2 33
  • sed與awk實例 文本間隔 在每一行后面增加一空行 將原來的所有空行刪除并在每一行后面增加一空行醇疼。這樣在輸出的文...
    stuha閱讀 1,901評論 0 21
  • awk命令的基本使用 [root@shellscript ~]# head -n 3 /etc/passwd | ...
    古寒飛閱讀 1,065評論 0 2