我想在目录中的每个文件上运行一个AWK脚本,但AWK命令必须只在该文件中运行 - 也就是说,它在定义的RS之间搜索并返回它应该的内容,但是我需要它当它到达一个文件的末尾时停止,并在下一个文件的开头再次开始。
我有这样的运行,它分别对每个文件起作用:
awk '!/value1|value2/ && NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt
但是,当使用
将输出应用到目录中的每个文件时,输出不正确find . -type f | awk ... file1 > result.txt
如何让它分别查看每个文件,但将结果附加到同一个文件中?不幸的是我不知道。我想这是通过将每个文件添加到变量中并让AWK查看它,但我不知道该怎么做。
interface Vlan3990
ip address 172.17.226.23 255.255.255.254
version 12.2
ip tacacs source-interface Loopback99
ip vrf test
description xx
interface Loopback99
description Management Loopback
interface Loopback100
shutdown
find . -type f | xargs awk '!/description|shutdown/ && NF {print FILENAME " - " RS,$1}' RS="interface" | more
./file1 - interface Vlan3990
./file2 - interface version
我不确定输出'界面版本'来自哪里......
答案 0 :(得分:8)
仅适用于当前目录:
for file in *
do awk ... "$file"
done > result.txt
如果您需要递归到子目录:
find . -type f -exec awk ... {} ; > result.txt
在这两种情况下,您都应该将result.txt
放在不同的目录中。否则,它将被匹配并用作输入文件。或者使用仅匹配所需文件的通配符,并且与result.txt
不匹配。
答案 1 :(得分:1)
试试这个,给出2个发布的输入文件:
$ gawk '
function prtName() {
if (name)
print FILENAME, name
name=""
}
/^interface/ { prtName(); name=$0 }
/^ (description|shutdown)/ { name="" }
ENDFILE { prtName() }
' file1 file2
file1 interface Vlan3990
这就是你要找的东西吗?请注意,它是特定的gawk(由ENDFILE
提供)我认为很好,因为您发布的示例命令也是特定于gawk但如果这是一个问题,只需为FNR == 1添加测试并将ENDFILE更改为END :
$ awk '
function prtName() {
if (name)
print filename, name
name=""
}
FNR==1 { prtName(); filename=FILENAME }
/^interface/ { prtName(); name=$0 }
/^ (description|shutdown)/ { name="" }
END { prtName() }
' file1 file2
file1 interface Vlan3990