文本替换sed+字段处理cut,join+awk重新编排字段
【1】sed工具(Stream Editor)——流編輯器
sed 本身也是一個(gè)管線(管道)命令,可以分析 standard input 的啦! 而且 sed 還可以將數(shù)據(jù)進(jìn)行取代、刪除、新增、截取特定行等等的功能呢!
1.1)以行為單位的新增/刪除功能
【玩玩荔枝呢】
【輸出不是輸出是 刪除,刪除】
1.2)以行為單位的取代與顯示功能
1.3) 部分?jǐn)?shù)據(jù)的搜索并取代的功能(g=global)
【Attention】上表中特殊字體的部分為關(guān)鍵詞,請(qǐng)記下來(lái)!至于三個(gè)斜線分成兩欄就是新舊字符串的替換啦!
荔枝要求
假設(shè)我只要 MAN 存在的那幾行數(shù)據(jù), 但是含有 # 在內(nèi)的批注我不想要,而且空白行我也不要!此時(shí)該如何處理呢?
1.4)直接修改檔案內(nèi)容(危險(xiǎn)動(dòng)作)
sed 甚至可以直接修改檔案的內(nèi)容呢!
【玩玩荔枝吧】
【Declaration】 以下內(nèi)容總結(jié)于shell腳本學(xué)習(xí)指南
【1】sed——stream editor 流編輯器
貼一張鳥(niǎo)哥的圖片
1.1)替換細(xì)節(jié)——s命令里以g結(jié)尾表示: glocal 全局
1.2)sed的運(yùn)作
sed 讀取每個(gè)文件,一次讀一行,將讀取的行放到內(nèi)存的一個(gè)區(qū)域——稱為模式空間。
1.3) 你還記得head嗎?
head N file count=$1 sed ${count}q "$2" # $1=N, $2=file1.4) 說(shuō)替換
范圍:可指定行的范圍,以逗點(diǎn)隔開(kāi)
sed -n '10,20p' hadoop.sh 只打印10~20行sed -n '/export/,/export/ s/word1/word2/g' 在export和export之間的行,用word2全局替換word1 sed -n '/tang/ !s/am/AM/g' tang.txt 在沒(méi)有tang的行用AM替換am;
1.5)有多少文本會(huì)改動(dòng)
和有多少愛(ài)可以重來(lái)是一樣的?呵呵了?
有多少文本會(huì)匹配 + 從哪兒開(kāi)始匹配?
【Answers】:
正則表達(dá)式可以匹配整個(gè)表達(dá)式輸入文本中最長(zhǎng)的,最左邊的子字符串。除此之外,匹配的空null字符串,則被認(rèn)為是比完全不匹配的還長(zhǎng)。
如ab*c , 匹配ac, 而b* 成功匹配a c 間的null字符串。
by the way, POSIX指出:完全一致的匹配,指的是最左邊開(kāi)始匹配,針對(duì)每一子模式, 由左向右,必須匹配最長(zhǎng)的可能字符串。
(子模式指的是在ERE下圓括號(hào)的部分)
【看個(gè)荔枝,you should got it】
【2】字段處理
2.1)cut剪切文本
cut -c 以字符為主 做剪切操作 (startup 1) cut -d 設(shè)置分隔符 cut -f 以字段為主 進(jìn)行剪切操作 (startup 1)【荔枝時(shí)間到】
2.2)join連接文本
主要選項(xiàng)
- -1 field1 表明要結(jié)合 的 字段
- -2 field2 表明要結(jié)合 的 字段
- -o file.field 輸出file的field字段,其他字段不打印
- -t seperator 分隔符
【3】使用awk重新編排字段
(以下內(nèi)容轉(zhuǎn)自鳥(niǎo)哥)
awk 主要是處理『每一行的字段內(nèi)的數(shù)據(jù)』,而默認(rèn)的『字段的分隔符為 “空格鍵” 或 “[tab]鍵” 』!
【Attention】注意awk的處理格式。
【相關(guān)說(shuō)明】
以上面的例子來(lái)說(shuō), root 是 1,因為他是第一欄嘛!至于192.168.1.100是第三欄,所以他就是3 啦!后面以此類推~呵呵!還有個(gè)變數(shù)喔!那就是 0,0 代表『一整行資料』的意思~以上面的例子來(lái)說(shuō),第一行的 $0 代表的就是『root …. 』那一行啊!
3.1)awk的處理流程:
經(jīng)過(guò)這樣的步驟,你會(huì)曉得, awk 是『以行為一次處理的單位』, 而『以字段為最小的處理單位』。
3.2)那么 awk 怎么知道我到底這個(gè)數(shù)據(jù)有幾行?
有幾欄呢?這就需要 awk 的內(nèi)建變量的幫忙啦~
【荔枝時(shí)間到】
列出每一行的賬號(hào)(就是 $1); ? 列出目前處理的行數(shù)(就是 awk 內(nèi)的 NR 變量) ? 并且說(shuō)明,該行有多少字段(就是 awk 內(nèi)的 NF 變量)
【Attention】
要注意喔,awk 后續(xù)的所有動(dòng)作是以單引號(hào)『 ’ 』括住的,由于單引號(hào)和雙引號(hào)都必須是成對(duì)的, 所以, awk 的格式內(nèi)容如果想要以 print 打印時(shí),記得非變量的文字部分,包含上一小節(jié) printf 提到的格式中,都需要使用雙引號(hào)來(lái)定義出來(lái)喔(單引號(hào)里面內(nèi)嵌雙引號(hào))!因?yàn)閱我?hào)已經(jīng)是 awk 的指令固定用法了!
【Attention】
注意喔,在 awk 內(nèi)的 NR, NF 等變量要用大寫,且不需要用錢字號(hào) $ 啦!
【Complementary】
awk的print 語(yǔ)句會(huì)自動(dòng)換行,就想C中的printf語(yǔ)句類似;
但是如果換做用printf來(lái)格式化打印字符串的話,就要通過(guò)\n轉(zhuǎn)義序列的使用來(lái)進(jìn)行換行功能。
3.3)awk的邏輯運(yùn)算符號(hào);
值得注意的是那個(gè)『 == 』的符號(hào),因?yàn)?#xff1a;
? 邏輯運(yùn)算上面亦即所謂的大于、小于、等于等判斷式上面,習(xí)慣上是以『 == 』來(lái)表示;
? 如果是直接給予一個(gè)值,例如變量設(shè)定時(shí),就直接使用 = 而已(=賦值變量符號(hào))。
【荔枝又來(lái)了】
好了,我們實(shí)際來(lái)運(yùn)用一下邏輯判斷吧!舉例來(lái)說(shuō),在 /etc/passwd 當(dāng)中是以冒號(hào) “:” 來(lái)作為字段的分隔, 該檔案中第一字段為賬號(hào),第三字段則是 UID。那假設(shè)我要查閱,第三欄小于 10 以下的數(shù)據(jù),并且僅列出賬號(hào)和第三欄, 那么可以這樣做:
Problem: 有趣吧!不過(guò),怎么第一行沒(méi)有正確的顯示出來(lái)呢?
Reason:這是因?yàn)槲覀冏x入第一行的時(shí)候,那些變量 1,2… 默認(rèn)還是以空格鍵為分隔的,所以雖然我們定義了 FS=”:” 了, 但是卻僅能在第二行后才開(kāi)始生效。
How to solve it ?那么怎么辦呢?我們可以預(yù)先設(shè)定 awk 的變量啊! 利用 BEGIN 這個(gè)關(guān)鍵詞喔!這樣做:
(Attention:這里鳥(niǎo)哥要比shell腳本學(xué)習(xí)指南講的要好得多)
3.4) Relative Specification:
(1)awk的指令間隔:所有 awk 的動(dòng)作,亦即在 {} 內(nèi)的動(dòng)作,如果有需要多個(gè)指令輔助時(shí),可利用分號(hào)『;』間隔(這就是剛才為什么會(huì)報(bào)awk語(yǔ)法錯(cuò)誤的原因,因?yàn)樯偌恿艘粋€(gè)分號(hào)[;]), 或者直接以 [Enter] 按鍵來(lái)隔開(kāi)每個(gè)指令,例如上面的范例中,鳥(niǎo)哥共按了三次 [enter] 喔!
(2)? 邏輯運(yùn)算當(dāng)中,如果是『等于』的情況,則務(wù)必使用兩個(gè)等號(hào)『==』!
(3)? 格式化輸出時(shí),在 printf 的格式設(shè)定當(dāng)中,務(wù)必加上 \n ,才能進(jìn)行分行! 不過(guò)要用雙引號(hào)吧\n包起來(lái);
(4)? 與 bash shell 的變量不同的是,在 awk 當(dāng)中,變量是可以直接使用的,不需加上 $ 符號(hào)。
【Note】以上的 說(shuō)明很是重要,牢記。
【print 與 printf 的 區(qū)別的例子】
3.4) awk 的動(dòng)作內(nèi) {} 也是支持 if (條件) 的喔!
總結(jié)
以上是生活随笔為你收集整理的文本替换sed+字段处理cut,join+awk重新编排字段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为有源头活水来的上一句 这句话是出自哪里
- 下一篇: 关于bochs用X11启动的说明