我有一个包含内容的文件:
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。
/ usr / bin / host 172.0.0.10 | / bin / awk' {sub(/.$/,"");打印$ 5}' 给出:hostname.domain.com
/ usr / bin / host 172.0.0.10 | / bin / awk' {sub(/.$/,"");打印$ 1}' 给出:10.0.0.172.in-addr.arpa
- 子函数将匹配到行的结尾,因为有一个"。" 什么是""在做什么? - 我不明白awk是如何将事物拆分成列的?
答案 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"> + 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 " " " "
我的输出只是OK