2014-09-30 48 views
0

我有一個文件與內容:AWK子功能語法

aaa.bbb.ccc ddd.eee.fff.ggg h.i.j.k 

如果我使用的代碼:

awk '{sub(/\.$/, ""); print $1}' test.txt 
returns aaa.bbb.ccc 

awk '{sub(/\.$/, ""); print $3}' test.txt 
Returns: h.i.j.k 

我明白子功能是用來爲:子(正則表達式,更換,目標)

我不明白這部分$ /,從子函數。 什麼是$?

感謝

UPDATE

好吧,我喜歡你的解釋事物的方式 - 謝謝!

如果我申請這一個真實的例子,

在/ usr/bin中/主機172.0.0.10

01.0.0.172.in-addr.arpa域名指針hostname.domain.com。

  1. /usr/bin/host 172.0.0.10 |/bin/awk'{sub(/.$/,「」);打印$ 5}' 給出:hostname.domain.com

  2. /usr/bin/host 172.0.0.10 |/bin/awk'{sub(/.$/,「」);打印$ 1}」 給出:10.0.0.172.in-addr.arpa

-The子功能將匹配該行的末尾是有‘’ - 「」在做什麼? - 我不明白awk如何將東西分解成列?

回答

0
sub(/regexp/, replacement, target) 
sub(/\.$/, replacement, target) 

你的正則表達式是\.$,不.$/

\是轉義字符。它逃離了它後面的角色,從而脫離了它的含義並從字面上處理它。

regex.匹配任何單個字符。除非它像\那樣轉義,因此它只是匹配點字符.

$只是表示行結束。

把此一起,\.$是在該行的末尾的逃脫點。這將匹配例如在一段時間內結束的段落的任何末尾。

在您的例子中,sub因爲沒有.在該行的末尾不能替代任何(與.k您的輸入端。因此,第一個awk只是打印第1列,而另一個打印第3列。

更新

爲您更新的問題。

awk中由空白默認情況下,在你輸入分割列的字符串。因此,列像此:

01.0.0.172.in-addr.arpa domain name pointer hostname.domain.com. 
|----------$1-----------|--$2--|-$3-|--$4---|----------$5--------| 
sub命令

,AWK發現的點在該行的末端,並用其""是空字符串替換(即它只是刪除它)

因此,你的第一個命令 - {sub(/.$/, ""); print $5},它打印第5列是hostname.domain.com.它在末尾替換.沒有(刪除它)。值得一提的是,在這個正則表達式,你不要逃避.了,所以該模式只匹配任何字符末,並刪除它(它正好是一個.在你輸入)

你的其他命令 - {sub(/.$/, ""); print $1}刪除最後一行的字符,然後只打印第一列,然後只打印第一列10.0.0.172.in-addr.arpa

您也可以在awk中設置自定義列分隔符,我建議您閱讀awk的一些介紹和教程,以更好地理解有用。例如。 simple awk tutorial

+0

謝謝,你善於解釋的事情。我已經擴大了。查看更新 – Matzuba 2014-10-01 06:24:19

+0

我編輯了我的帖子以覆蓋您更新的問題 – confused00 2014-10-01 08:18:09

+0

再次感謝您花時間引導我完成此操作,我現在明白了!我不知道默認情況下是由空白區域分割出來的,並且認爲它是在用「。」進行巧妙的操作。一個非常有建設性的答案,我會進一步閱讀awk和正則表達式。歡呼你的時間,榮譽! – Matzuba 2014-10-01 12:42:20

0

sub(regexp, replacement, target)

所以在這裏我們使用正則表達式爲\.$,其中在最後的點相匹配。這裏sub(/\.$/, "")我們沒有提到目標,所以它需要$0即整條線。如果您指定了任何目標,它只會刪除該特定列上的最後一個點。

awk '{sub(/\.$/, ""); print $1}' test.txt 

移除一個點,它存在僅在一行並且僅打印第1列。如果在最後沒有點的端部,則不會出現更換。

awk '{sub(/\.$/, ""); print $3}' test.txt 

刪除點在該行並打印僅列結束3.由於有結尾沒有點,則返回第三列又名最後一列,因爲它是。

例子:

$ cat file 
aaa.bbb.ccc. ddd.eee.fff.ggg h.i.j.k. 
$ awk '{sub(/\.$/, ""); print $1}' file 
aaa.bbb.ccc. 
$ awk '{sub(/\.$/, ""); print $3}' file 
h.i.j.k