我正在学习 awk 教程,它需要使用“.awk”文件。我在使用它时遇到了问题,因为 awk 没有按预期工作。这是我正在使用的代码。 virt.awk 文件的内容
BEGIN { RS="\n\n" ; }
$0 ~ search { print }
现在预期的结果是我搜索一个模式并且应该显示特定的记录。但是当我尝试以下操作时,我会显示整个文件。
我正在使用的命令:
awk -f virt.awk search=domain1 virtualhosts.conf
无论我在搜索词中使用什么,我都会打印整个文件。域 1、域 2、域 3 等的所有条目有人可以帮忙吗?
注意:它只是 virtualhosts.conf 文件的副本,并且已预先格式化为完全相同的格式,即每个条目后有空行,并且之间没有其他空行。
virtualhost.conf 的内容:(以及我总是得到的结果):
<VirtualHost 172.20.30.40:80>
DocumentRoot "/www/domain1"
ServerName www.domain1.com
#Other options
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot "/www/domain2"
ServerName www.domain2.com
#Other options
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot "/www/domain3-80"
ServerName www.domian3.org
#Other options
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot "/www/example2-8080"
ServerName www.example.org
#Other options
</VirtualHost>
其他详细信息:我发现我正在使用 mawk,因此我安装了 gawk,但我仍然得到相同的结果。我正在使用 pop-os 20.04 和 dash 顺便说一下(如果这会影响任何事情)
user@pop-os:~/linuxwork$ which awk
/usr/bin/awk
user@pop-os:~/linuxwork$ ll /usr/bin/awk
lrwxrwxrwx 1 root root 21 Mar 30 21:10 /usr/bin/awk -> /etc/alternatives/awk*
user@pop-os:~/linuxwork$ ll /etc/alternatives/awk
lrwxrwxrwx 1 root root 13 Aug 6 20:21 /etc/alternatives/awk -> /usr/bin/gawk*
user@pop-os:~/linuxwork$
答案1
几乎可以肯定,您的输入文件中有 DOS 行结尾,因为文件中不会有\n\n
s,而是全部都是\r\n\r\n
s。更改RS="\n\n"
为RS=""
(这是您真正应该使用的,以便可移植到所有 awks)或RS="\r\n\r\n"
orRS="\r?\n\r?\n"
并查看您得到的输出。
还可以运行并在每行末尾cat -Ev virtualhost.conf
查找指示回车符 ( = = ) 和后跟换行符 ( = = ) 的内容。^M$
CR
\r
^M
LF
\n
$
看为什么我的工具输出会覆盖自身以及如何修复它有关 DOS 行结尾的更多信息以及当您想要对此类文件运行 Unix 工具时如何解决它们。