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