shell腳本兩個(gè)文件關(guān)鍵行合并方式
shell腳本兩個(gè)文件關(guān)鍵行合并
1.寫(xiě)作意圖
有兩個(gè)文件,分別是文件A和文件B。
指定A文件的某些行,并提取關(guān)鍵字key,然后在B文件中查找關(guān)鍵字key所在的行,并把A文件中關(guān)鍵字key所在的行與B文件關(guān)鍵字key所在的行合并起來(lái)寫(xiě)到文件C中.這樣的小功能如果用C/C++寫(xiě)將變得復(fù)雜,那么有沒(méi)有什么簡(jiǎn)介的方式呢?
答案是肯定的.Linux下的shell scripts提供十分強(qiáng)大的功能.可以通過(guò)自帶的各種命令小工具cat\grep\cut\awk\tail等等,然后通過(guò)管道方式拼接,最后通過(guò)shell腳本就可以完成很強(qiáng)大的文本信息搜集與分析功能.
話(huà)不多說(shuō),僅僅把自己會(huì)的貢獻(xiàn)出來(lái).
2.shell按行讀取文件信息
我們從文件decoders的11行開(kāi)始讀取每行的字符串信息,并將其保存到shell的變量line中.
#!/bin/bash cat decoders|tail -n +11|while read line do echo $line done
通過(guò)上面的程序,就可以獲取文件decoders的每行數(shù)據(jù),并將其保存在變量line中,簡(jiǎn)單的測(cè)試一下,果然從11行開(kāi)始打印.
3.提取每行第3列的信息
對(duì)于上面的程序增強(qiáng)一下功能,提取第3列的關(guān)鍵字并打印,如012v\4xm這樣的關(guān)鍵字.這里就再次將變量的值通過(guò)標(biāo)準(zhǔn)輸入流送給cut命令,讓該命令完成分割提取工作.最后將提取的結(jié)果保存在變量line1中
#!/bin/bash cat decoders|tail -n +11|while read line do line1=`echo $line|cut -d " " -f 3` echo $line1 done
"|"是管道命令,echo $line將標(biāo)準(zhǔn)輸出結(jié)果送到cut指令中進(jìn)行處理,cut -d " " -f 3表示按照空格分割字符串line,并提取第3列的字符串到變量line1中。小小的shell命令,經(jīng)過(guò)管道拼接,真是強(qiáng)大。
4.在另一個(gè)文件B中查找關(guān)鍵字key
通過(guò)上面的兩個(gè)步驟,就提取到了關(guān)鍵字line,那么接下來(lái)從文件MAINTAINERS中查找關(guān)鍵字line,并將所在的行打印出來(lái)。
#!/bin/bash cat decoders|tail -n +11|while read line do line1=`echo $line|cut -d " " -f 3` line2=`grep $line1 MAINTAINERS` echo $line2 done
這里果然匹配到關(guān)鍵字4xm所在的行,對(duì)于匹配不到的行,將輸出空字符串。
5.字符串非空判斷輸出
#!/bin/bash cat decoders|tail -n +11|while read line do line1=`echo $line|cut -d " " -f 3` line2=`grep $line1 MAINTAINERS` if [ -n "$line2" ];then echo $line2 fi done
通過(guò)shell的判斷語(yǔ)句將非空的結(jié)果打印出來(lái)
6.關(guān)鍵字key所在的文件A的行內(nèi)容與所在的文件B行內(nèi)容合并顯示
#!/bin/bash cat decoders|tail -n +11|while read line do line1=`echo $line|cut -d " " -f 3` line2=`grep $line1 MAINTAINERS` if [ -n "$line2" ];then echo $line echo $line2 fi done
到此,一個(gè)看似復(fù)雜的功能,通過(guò)shell就輕松的搞定.
最后通過(guò)sh test.sh>C.log輸出流重定向到C文件中,C文件保存了合并的結(jié)果
shell將多行合并成一行的小技巧
Shell中將多行合并成一行的小技巧,其實(shí)很簡(jiǎn)單: 每行的結(jié)尾符為\n,只要將每行的\n換成想要的分隔符,就可以達(dá)到目的了。
主要借助于tr命令
[root@host ~]# cat data 127.0.0.1 127.0.0.2 127.0.0.3 127.0.0.4 [root@host ~]# cat data | tr '\n' '|' ? ? ? ?# 行間以|來(lái)分隔 127.0.0.1|127.0.0.2|127.0.0.3|127.0.0.4
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用shell刪除數(shù)據(jù)表中指定信息和字段對(duì)應(yīng)的文件
這篇文章主要介紹了利用shell刪除數(shù)據(jù)表中指定信息和字段對(duì)應(yīng)的文件,需要的朋友可以參考下2014-04-04Linux下使用Shell腳本實(shí)現(xiàn)進(jìn)程監(jiān)控的流程
這篇文章主要介紹了Linux下使用Shell腳本實(shí)現(xiàn)進(jìn)程監(jiān)控,在 Linux 平臺(tái)下,shell 腳本監(jiān)控是一個(gè)非常簡(jiǎn)單、方便的工具,它可以有效的對(duì)服務(wù)器、進(jìn)程進(jìn)行監(jiān)控,對(duì)系統(tǒng)開(kāi)發(fā)以及進(jìn)程維護(hù)人員非常有幫助,需要的朋友可以參考下2023-02-02編寫(xiě)shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤(pán)的方法
這篇文章主要介紹了編寫(xiě)shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤(pán)的方法,注意Dropbox在國(guó)內(nèi)訪問(wèn)的網(wǎng)絡(luò)相關(guān)問(wèn)題,需要的朋友可以參考下2015-07-07fedora 23 lvm2格式 根目錄磁盤(pán)空間不足 擴(kuò)容方法
下面小編就為大家?guī)?lái)一篇fedora 23 lvm2格式 根目錄磁盤(pán)空間不足 擴(kuò)容方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Shell腳本中引用、調(diào)用另一個(gè)腳本文件的2種方法
這篇文章主要介紹了Shell腳本中引用、調(diào)用另一個(gè)腳本文件的2種方法,本文介紹了兩種方法的語(yǔ)法,然后給出實(shí)際使用實(shí)例和一些要注意的地方,需要的朋友可以參考下2015-06-06shell自定義函數(shù)的6個(gè)特點(diǎn)總結(jié)
這篇文章主要介紹了shell自定義函數(shù)的6個(gè)特點(diǎn)總結(jié),也是使用shell自定義函數(shù)的一些注意事項(xiàng)總結(jié),以及小技巧介紹,需要的朋友可以參考下2014-07-07