二,awk分隔符
在前一篇文章中我們略微提到過"分隔符",但是並沒有細說,那麼我們今天就聊聊什麼是分隔符,awk有哪些分隔符,awk的預設分割符是空格,但是,這樣描述並不精確,因為,awk的分隔符還分為兩種,"輸入分隔符" 和 "輸出分隔符" 。
此處我們先將分隔符的概念列出,看不懂沒關係,我們會一一進行舉例,到時自然會明白。
輸入分隔符,英文原文為field separator,此處簡稱為FS
輸入分割符,預設是空白字元(即空格),awk預設以空白字元為分隔符對每一行進行分割。
輸出分割符,英文原文為output field separator,此處簡稱為OFS
awk將每行分割後,輸出在螢幕上的時候,以什麼字元作為分隔符,awk預設的輸出分割符也是空格。
光看概念是不是不容易搞明白?沒關係,我們來動手實踐一下,勝過千言萬語。
輸入分隔符
我們現在通過一些小例子,搞明白這兩個分隔符的作用,不過我們要一個一個來,我們先看一些"輸入分隔符"的小例子
輸入分隔符比較容易理解,當awk逐行處理文字的時候,以輸入分隔符為準,將文字切成多個片段,預設使用空格,但是,如果一段文字中沒有空格,我們可以指定以特定的文字或符號作為輸入分割符,比如下圖中的例子,我們指定使用"#"作為輸入分隔符。
[root@node1 ~]# cat test abc#123#iuy#ddd 8ua#456#auv#ppp#7y7 [root@node1 ~]# awk -F# '{print $1,$2}' test abc 123 8ua 456
上圖中,我們使用了-F 選項,指定了使用#號作為輸入分隔符,於是,awk將每一行都通過#號為我們分割了。
除了使用 -F 選項指定輸入分隔符,還能夠通過設定內部變數的方式,指定awk的輸入分隔符,awk內建變數FS可以用於指定輸入分隔符,但是在使用變數時,需要使用-v選項,用於指定對應的變數,比如 -v FS='#',如下圖
[root@node1 ~]# awk -v FS='#' '{print $1,$2}' test abc 123 8ua 456
其實不管是通過-F選項,還是通過FS這個內建變數,目的都是設定指定的輸入分隔符,達到的效果是相同的,我們會在另一篇文章中單獨對awk的變數進行總結,如果你不理解這些變數,沒有關係,後面自然會明白。
而此處,我們使用了awk中的一個選項,就是-F,還記得我們之前總結的awk的使用語法嗎。
我們說過,awk的語法如下
awk [options] 'Pattern{Action}' file
而-F,就是options的一種,用於指定輸入分隔符。
-v也是options的一種,用於設定變數的值。
再結合之前的文章,我們已經將options 、pattern 、action都簡單的應用了一遍,好了,我們已經"會用"awk了。
輸出分隔符
那麼什麼是輸出分隔符呢?聰明的你應該已經發現了,當awk為我們輸出每一列的時候,會使用空格隔開每一列,其實,這個空格,就是awk的預設的輸出分隔符,下圖中紅線標註的空格部分,就是awk的預設的輸出分隔符。
輸出分割符的意思就是:當我們要對處理完的文字進行輸出的時候,以什麼文字或符號作為分隔符。
我們可以使用awk的內建變數OFS來設定awk的輸出分隔符,當然,使用變數的時候要配合使用-v選項,示例如下
[root@node1 ~]# cat test1 abc 123 iuy ddd 8ua 456 auv ppp 7y7 [root@node1 ~]# awk -v OFS="+++" '{print $1,$2}' test1 abc+++123 8ua+++456
現在,我們可以同時指定輸入分隔符和輸出分割符了,示例如下
[root@node1 ~]# cat test abc#123#iuy#ddd 8ua#456#auv#ppp#7y7 [root@node1 ~]# awk -v FS='#' -v OFS='---' '{print $1,$2}' test abc---123 8ua---456
我們剛才解釋了awk的輸出分隔符,如果,在輸出的時候,我們想要讓兩列合併在一起顯示,不使用輸出分隔符分開顯示,該怎麼做呢?如下圖所示,藍線之上使用預設的輸出分隔符進行了分隔,而藍線之下的兩種方法均未使用輸出分隔符進行分隔,而是將兩列合在一起顯示了。
[root@node1 ~]# cat test1 abc 123 iuy ddd 8ua 456 auv ppp 7y7 [root@node1 ~]# awk '{print $1 $2}' test1 abc123 8ua456 [root@node1 ~]# awk '{print $1$2}' test1 abc123 8ua456
細心如你一定發現了,上圖中的示例在語法上的區別就是,一個有"逗號",一個沒有"逗號"。
awk '{print $1 $2}' 表示每行分割後,將第一列(第一個欄位)和第二列(第二個欄位)連線在一起輸出。
awk '{print $1,$2}' 表示每行分割後,將第一列(第一個欄位)和第二列(第二個欄位)以輸出分隔符隔開後顯示。