bash - 使用文件扩展命令(特定)

时间:2018-01-23 12:55:08

标签: linux bash shell unix

因此我很难描述我想做什么,但我会尝试一下: (由于一些私人信息,我更改了名称)

我想用我创建的文本文件“diff”一个命令输出。 命令输出如下:

  'Blabla1' '12.34.56.78' (24 objects + dependencies), STATUS: 'RUNNING'
  'Blabla3' '12.34.56.89' (89 objects + dependencies), STATUS: 'RUNNING'

和txtfile:

Blabla1
Blabla2

如果它在命令输出中的任何地方找到Blabla1就可以了。但是你看,他不会在命令输出中找到Blabla2 任何地方,而这个差异我想作为输出。

我希望你理解我的意思,你可以帮助我。

问候, 可以

UPDATE ::::

@ hek2mgl

所以我的命令是:

  

./ factory.sh listapplications | grep -i running

此命令显示:

'ftp' '1' (7 objects + dependencies), STATUS: 'RUNNING' - 'XSD Da
'abc' '5.1.0' (14 objects + dependencies), STATUS: 'RUNNING' - '2017-10-13: Fix fuer Bug 2150'
'name' '1.0.2' (5 objects + dependencies), STATUS: 'RUNNING'

我想将该输出与我的文本文件进行比较:

ftp
abc
name
missing
alsomissing

因此,如果我现在比较它2,它应该检查他是否在命令输出中找到了我的文本文件ANYWHERE中的单词。如果它确实在任何地方找到它 - >不输出。

正如你所看到的,他不会发现“失踪”和“alsomissing”。我想把这两个作为最后的输出。

3 个答案:

答案 0 :(得分:1)

您可能感兴趣的是grep与“流程替代”结合使用。如果带有模式的文件是file.txt,并且您要执行的命令是cmd,那么您可以使用

grep -o -F -f file.txt <(cmd) | grep -v -F -f - file.txt

这将输出file.txt的格式cmd,这些格式在Blabla的输出中不匹配。

如果是Blabla2 示例,则上面的行将输出

file.txt

如何运作如下。第一部分将搜索cmd输出中% grep -o -F -f file.txt <(cmd) Blabla1 中列出的所有模式,并仅输出匹配的部分。这意味着

file.txt

此输出现在通过管道传递到另一个命令,该命令将尝试查找-f -中与管道中传来的任何模式都不匹配的所有行(% grep -o -F -f file.txt <(cmd) | grep -v -F -f - file.txt Blabla2

keyup

答案 1 :(得分:1)

所以...这似乎是这样做的,使用bash进程替换:

$ cat file1
  'Blabla1' '12.34.56.78' (24 objects + dependencies), STATUS: 'RUNNING'
  'Blabla3' '12.34.56.89' (89 objects + dependencies), STATUS: 'RUNNING'
$ cat file2
Blabla1
Blabla2
$ grep -vFf <(awk '{gsub(/[^[:alnum:]]/,"",$1);print $1}' file1) file2
Blabla2

awk脚本取第一个字段,从中删除非字母数字字符(即单引号)并仅输出第一个字段。 grep选项-f使用上述进程替换创建的“虚拟”文件作为要在输入文件(file2)中搜索的固定字符串列表,-v反转搜索,只显示未找到的内容。

如果gsub()中的正则表达式过于贪婪,您可以将其替换为$1=substr($1,2,length($1)-2)之类的内容。

您可以单独在(POSIX)awk中执行此操作,而不依赖于bash流程替换:

$ awk 'NR==FNR{a[substr($1,2,length($1)-2)];next} $1 in a{next} 1' file1 file2
Blabla2

file1的剥离的第一个字段读入数组的键中,然后为file2的每一行检查数组中是否存在该键,跳过匹配并打印任何键的行遗留下来。 (脚本末尾的1是“打印此行”的简写。)

答案 2 :(得分:0)

您也可以仅使用awk

awk '
# Store patterns of text.file in an array (p)atterns.
# Initialize their count of occurrence with 0
NR==FNR{
    p[$0]=0
    next
}

# Replace the quotes around BlaBla... in cmd output.
# Increase the count of occurrence of the pattern
{
    gsub("'\''", "")
    p[$1]++
}

# At the end of the input print those patterns which
# did not appear in cmd output, meaning their count of
# occurrence is zero.
END{
    for(i in p){
        if(p[i]==0){
            print i
        }
    }
}' text.file cmd.txt

PS:或者您使用进程替换而不是将命令输出存储在文件中。然后将cmd.txt替换为<(cmd)