Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在带有多个grep命令的IF中使用NOT运算符_Bash_Shell_Sh_Ksh - Fatal编程技术网

Bash 在带有多个grep命令的IF中使用NOT运算符

Bash 在带有多个grep命令的IF中使用NOT运算符,bash,shell,sh,ksh,Bash,Shell,Sh,Ksh,我不熟悉Shell脚本,正在编写一个kornshell脚本 我的目标是在4个单独的文件中搜索fileA.txt中的每一行(我们称它们为fileA.txt,fileB.txt,fileC.txt和fileD.txt)。我需要为fileA.txt中的行打印“未找到”,这些行在单独文件的四个文件中都没有找到 所以我提出了下面的If语句。我正在尝试使用&&组合4个grep命令,并执行逻辑Not(!),因为我只需要在这4个文件中都没有找到的行 for i in $(<fileA.txt); do

我不熟悉Shell脚本,正在编写一个kornshell脚本

我的目标是在4个单独的文件中搜索
fileA.txt
中的每一行(我们称它们为
fileA.txt
fileB.txt
fileC.txt
fileD.txt
)。我需要为
fileA.txt
中的行打印“未找到”,这些行在单独文件的四个文件中都没有找到

所以我提出了下面的If语句。我正在尝试使用&&组合4个grep命令,并执行逻辑Not(!),因为我只需要在这4个文件中都没有找到的行

for i in $(<fileA.txt);
do
    if !((grep -q $i fileB.txt) && (grep -q $i fileB.txt) && (grep -q $i fileC.txt) && (grep -q $i fileD.txt)); then
        print "$i not found in either of 4 files"
    fi
done

对于i in$(您不需要括号。事实上,因为您使用的是
&&
,所以不需要对
grep
分别调用3次

while IFS= read -r line; do
  if ! grep -q "$i" fileB.txt fileC.txt fileD.txt; then
    print "$i not found in any of the 3 files"
  fi
done < fileA.txt  

您不需要括号。事实上,因为您使用的是
&&
,所以不需要对
grep
分别调用3次

while IFS= read -r line; do
  if ! grep -q "$i" fileB.txt fileC.txt fileD.txt; then
    print "$i not found in any of the 3 files"
  fi
done < fileA.txt  

它没有回答您提出的问题,因此违反了SO政策,但有一种方法可以一次性解决您在awk方面的实际问题,我无法给出合理的评论:

 awk 'FNR==NR{a[$0];next} {for(p in a)if($0~p){delete a[p]}} \
   END{for(p in a)print "notfound: ",p}' patternfile data1 data2 data3 etc
notfound:
只是为了清楚起见,您可以根据需要更改或省略它

输出值(在任何数据文件中都找不到的模式)的顺序不一定与patternfile中的顺序相同;如果您关心这一点:

 awk 'FNR==NR{a[$0]=FNR;next} {for(p in a)if($0~p){delete a[p]}} \
   END{for(p in a)print a[p],p}' patternfile data1 data2 data3 etc | sort -k1n | cut -f2-
 # or in GNU awk v4+ only
 awk 'FNR==NR{a[$0]=FNR;next} {for(p in a)if($0~p){delete a[p]}} \
   END{PROCINFO["sorted_in"]="@val_num_asc";for(p in a)print p}' patternfile data1 data2 data3 etc 
您的问题对于“行”也是模棱两可的;您的意思是patternfile中的每一行都应该作为一行出现在其中一个数据文件中,还是可以出现在一行中,但不一定出现在整行中?另外,patternfile中的值是否仅是数据字符,或者其中是否有任何特殊字符与数据中的某些内容相匹配?例如例如,如果patternfile包含一行
boojum..
数据文件包含以下任何一行,则该项将被视为已找到:

 boojum..
 boojumXY
 the snark was a boojum!!
o模式文件行
^abc
将匹配:

 abc
 abcdefghi
但不会匹配:

 ^abc

您可以使用选项
-x
,literal(非正则表达式)在
grep
中获得完整的行匹配与
-F
匹配,或两者都匹配。这些也可以在
awk中实现,但不同。

它没有回答您提出的问题,因此违反了SO政策,但有一种方法可以一次性解决您在awk中的实际问题,我无法给出合理的评论:

 awk 'FNR==NR{a[$0];next} {for(p in a)if($0~p){delete a[p]}} \
   END{for(p in a)print "notfound: ",p}' patternfile data1 data2 data3 etc
notfound:
只是为了清楚起见,您可以根据需要更改或省略它

输出值(在任何数据文件中都找不到的模式)的顺序不一定与patternfile中的顺序相同;如果您关心这一点:

 awk 'FNR==NR{a[$0]=FNR;next} {for(p in a)if($0~p){delete a[p]}} \
   END{for(p in a)print a[p],p}' patternfile data1 data2 data3 etc | sort -k1n | cut -f2-
 # or in GNU awk v4+ only
 awk 'FNR==NR{a[$0]=FNR;next} {for(p in a)if($0~p){delete a[p]}} \
   END{PROCINFO["sorted_in"]="@val_num_asc";for(p in a)print p}' patternfile data1 data2 data3 etc 
您的问题对于“行”也是模棱两可的;您的意思是patternfile中的每一行都应该作为一行出现在其中一个数据文件中,还是可以出现在一行中,但不一定出现在整行中?另外,patternfile中的值是否仅是数据字符,或者其中是否有任何特殊字符与数据中的某些内容相匹配?例如例如,如果patternfile包含一行
boojum..
数据文件包含以下任何一行,则该项将被视为已找到:

 boojum..
 boojumXY
 the snark was a boojum!!
o模式文件行
^abc
将匹配:

 abc
 abcdefghi
但不会匹配:

 ^abc

您可以使用选项
-x
grep
中获得完整的行匹配,使用
-F
进行文本(非正则表达式)匹配,或者两者都可以。这些也可以在
awk
中实现,但方式不同。

您是想检查fileB.txt两次,还是想检查fileA.txt(这没有多大意义,因为
i
按定义将在fileA中找到)?您是想检查fileB.txt两次,还是指fileA.txt(这没有多大意义,因为
i
按定义将在fileA中找到)?非常感谢!我使用循环是因为我还需要对在其他两个文件中都找不到的每一行执行一些操作。在这种情况下,使用while循环会比使用for循环有优势吗?它们实际上并不相同。
grep-q x B C D
如果在任何文件B C D中找到x,则成功,但
grep-qxb&&grep-qxc&&grep-qxd
只有在每个文件中都找到x时才会成功。然而,看起来前者实际上是OP想要的。若在任何文件中找到A中的任何模式,oth
grep-fabcd
就会成功。好的一点。我更多地是根据描述进行的,所以我认为OP想要
|
ins无论如何都不要使用
&
(或者
!grep&&!grep&&…
)。在这种情况下,
grep-q x B C D
是OP想要的。非常感谢!我使用循环是因为我需要对在其他文件中都找不到的每一行做些什么。在这种情况下,使用while循环会比使用for循环有优势吗?它们实际上并不相同。
grep-qx B C D
若在任何文件B C D中找到x,则x B C D
会成功,但只有在每个文件中找到x时,
grep-q x B&&grep-q x C&&grep-q x D
才会成功。不过,似乎前者实际上是OP想要的。若在任何文件中找到A中的任何模式,则OTOH
grep-f A B C D
会成功。说得好。我说得更多根据描述,所以我认为OP想要
|
而不是
&&
(或者
!grep&&!grep&&&…
)。在这种情况下,
grep-qbbcd
就是OP想要的。