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

时间:2013-10-21 15:24:51

标签: file variables search awk

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

我有这样的运行,它分别对每个文件起作用:

awk '!/value1|value2/ && NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt

但是,当使用

将输出应用到目录中的每个文件时,输出不正确
find . -type f | awk ... file1 > result.txt

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

文件file1:

interface Vlan3990
 ip address 172.17.226.23 255.255.255.254

文件file2:

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

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

2 个答案:

答案 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
相关问题