运行目录中的所有文件,使用AWK单独处理每个文件

cap*_*ian 1 variables search awk file

我想在目录中的每个文件上运行一个AWK脚本,但是AWK命令必须只在该文件中运行 - 也就是说,它在定义的RS之间搜索并返回它应该的内容,但我需要它在它停止时到达一个文件的末尾,并在下一个文件的开头再次开始.

我有这个运行,它可以单独处理每个文件:

awk '!/value1|value2/ && NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt
Run Code Online (Sandbox Code Playgroud)

但是,当使用时将输出应用于目录中的每个文件时输出不正确

find . -type f | awk ... file1 > result.txt
Run Code Online (Sandbox Code Playgroud)

我如何让它分别查看每个文件,但将结果附加到同一个文件中?不幸的是我不知道.我想这是通过将每个文件添加到变量中并让AWK查看它,但我不知道该怎么做.

文件file1:

interface Vlan3990
 ip address 172.17.226.23 255.255.255.254
Run Code Online (Sandbox Code Playgroud)

文件文件2:

version 12.2
ip tacacs source-interface Loopback99
ip vrf test
 description xx
interface Loopback99
 description Management Loopback
interface Loopback100
 shutdown
Run Code Online (Sandbox Code Playgroud)

产量

find . -type f | xargs awk '!/description|shutdown/ && NF {print FILENAME " - " RS,$1}' RS="interface" | more
./file1 - interface Vlan3990
./file2 - interface version
Run Code Online (Sandbox Code Playgroud)

我不确定输出'界面版'来自哪里......

Bar*_*mar 9

仅适用于当前目录:

for file in *
do awk ... "$file"
done > result.txt
Run Code Online (Sandbox Code Playgroud)

如果您需要递归到子目录:

find . -type f -exec awk ... {} ; > result.txt
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您可能应该放在result.txt不同的目录中.否则,它将被匹配并用作输入文件.或者使用仅匹配所需文件的通配符,并且不匹配result.txt.

  • 不需要那个循环,awk完全能够在多个文件上运行. (2认同)