在Bash中使用另一组行过滤行

时间:2016-11-10 12:36:34

标签: linux bash grep filtering stdin

我的标准输入上有一行

$printf "C\nB\nA\n"
C
B
A

我希望过滤掉其他标准输入上出现的行(或子字符串或正则表达式 - 更容易):

$printf "B\nA\n"
B
A

我希望在条目过滤后只有C

我试过

$printf "C\nB\nA\n" | grep -v `printf "B\nA\n"`

但后来我得到了

grep: A: No such file or directory

如何通过其他命令返回的行执行标准输入的过滤?

3 个答案:

答案 0 :(得分:6)

您可以使用grep的{​​{1}}选项:

-f

并使用Matching Control -f FILE, --file=FILE Obtain patterns from FILE, one per line. [...] 语法将命令的输出用作要使用的内容:

<(command)

答案 1 :(得分:2)

使用awk来控制每条线应该如何相互匹配:

$ printf "C\nB\nA\n" | awk 'NF == FNR { a[$0] = 1; next } a[$0]' \
  <(printf "A\nB\n") - 

通过更改a[$0],您可以定义每个应匹配的方式,即打印行 来自file1.txt,第一列是file2.txt:

$ awk 'NF == FNR { a[$0] = 1; next } a[$1]' file2.txt file1.txt
#                                      ^ Print if column 1 from file1.txt
#                                        is in file2.txt

从file2.txt中打印第一列中包含的行。{/ p>

$ awk 'NF == FNR { a[$1] = 1; next } a[$0]' file2.txt file1.txt
#                                      ^ Print if line from file1.txt match
#                    ^ Store column one from file2.txt

答案 2 :(得分:0)

你可以使用

printf "C\nB\nA\n" | grep -v C

随后

printf "C\nB\nA\n" | grep -v C | grep -v B

然后

printf "C\nB\nA\n" | grep -v A | grep -v B

如果你想从文件中做到这一点 假设文件包含

C
B
A

然后:

cat file | grep -v B | grep -v A

将打印

C

如果你想只用一次管道过滤

cat file | grep -v 'B\|A'
C