AWK子函数语法

时间:2014-09-30 05:31:32

标签: regex 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

我理解子函数用作:sub(regexp,replacement,target)

我不理解这部分。$ /,来自子函数。 什么是。$?

感谢

更新

好的,我喜欢你解释事物的方式 - 谢谢你!

如果我将其应用于一个真实的例子,

/ usr / bin / host 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

  3. - 子函数将匹配到行的结尾,因为有一个"。" 什么是""在做什么? - 我不明白awk是如何将事物拆分成列的?

3 个答案:

答案 0 :(得分:1)

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

您的正则表达式为\.$,而不是.$/

\是转义字符。它逃脱了跟随它的角色,从而将其从regex意义上剥离并逐字处理。

.中的

regex匹配任何单个字符。除非它在您的示例中被\转义,因此它只匹配点字符.

$仅表示该行的结尾。

将这些放在一起,\.$是该行末尾的转义点。这将匹配例如以句点结尾的段落的任何结尾。

在您的示例中,sub不会替换任何内容,因为该行末尾没有.(您的输入以.k结尾。所以您的第一个{{1}只打印第一列,另一列打印第3列。

<强>更新

有关更新的问题。

默认情况下,Awk按空格拆分字符串。因此,在您的输入中,列是这样的:

awk

01.0.0.172.in-addr.arpa domain name pointer hostname.domain.com. |----------$1-----------|--$2--|-$3-|--$4---|----------$5--------| 命令中,awk在行尾找到点并替换为sub,这是空字符串(即只删除它)

所以你的第一个命令 - "",它打印了第5列,{sub(/.$/, ""); print $5}后,它替换了hostname.domain.com.,没有任何东西(删除它)。值得注意的是,在这个正则表达式中你不再逃避.,所以模式最后匹配任何字符并删除它(恰好是{{1}在你的输入中)

您的其他命令 - .会删除该行末尾的字符,然后只打印第一列.

你也可以在awk中设置自定义列分隔符,我建议你阅读一些关于awk的介绍和教程,以便更好地理解它是如何工作的。例如。 simple awk tutorial

答案 1 :(得分: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

答案 2 :(得分:0)

我有一张这种格式的桌子

<table width="700" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="ffcc00" bgcolor="ffcc00">
<tbody>
        <th colspan="7" bordercolor="ffcc00" bgcolor="000000" scope="col">
            <div align="center" class="style2">
                Exciter Power Supply</div>
        </th>
    </tr>
    <tr>
        <th width="175" bordercolor="ffcc00" bgcolor="000000" scope="col">
            <div align="center" class="style1">+ 3 V </div>
        </th>
        <th width="175" bordercolor="ffcc00" bgcolor="000000" scope="col">
            <div align="center" class="style1">
                OK</div>
        </th>
        <th width="175" bordercolor="ffcc00" bgcolor="000000" scope="col">
            <div align="center" class="style1">&nbsp;+ 5 V</div>
        </th>
        <th width="175" bordercolor="ffcc00" bgcolor="000000" scope="col">
            <div align="center" class="style1">
                OK</div>
        </th>
    </tr>
    
</tbody>

当我得到+3 V

的值时
curl -s http://my-site/index.htm | sed -e 's/<[^>]*>//g' | awk '/+ 3 V/{getline;  print}'

我的输出正常' '; + 5 伏

为了删除另一个字段的空格和文本,我使用 sub() 来更改字符加上 tr 来删除字符

curl -s http://my-site/index.htm | sed -e 's/<[^>]*>//g' | awk '/+ 3 V/{getline; sub(/+ 5 V/, ""); print}' | tr "&nbsp;" " "

我的输出只是OK