因此我很难描述我想做什么,但我会尝试一下: (由于一些私人信息,我更改了名称)
我想用我创建的文本文件“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”。我想把这两个作为最后的输出。
答案 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)
。