终端复杂命令

时间:2016-07-25 04:48:17

标签: bash unix sed terminal grep

我有几千行的.csv文件。其中一些行包含ABC,一些包含XYZ,一些包含其他内容(我不确定)。有没有办法找到不包含ABC或XYZ的行并通过unix识别它们?

基本上,我希望能够-grep所有没有两个ABC或XYZ的行,看看这些行是什么。

提前致谢!

3 个答案:

答案 0 :(得分:3)

没有什么“复杂”的。

grep -E -v 'ABC|XYZ' file | less

如果要排除仅包含 这些值的行,请添加-x选项,或将锚添加到正则表达式中; '^(ABC|XYZ)$'

您可能希望将less替换为更深入的分析。例如,标准| sort | uniq -c | sort -rn'将为不同的值生成频率计数。

printf 'A\nB\nABC\nA\nB\nXYZ\nA\n' |
grep -E -v 'ABC|XYZ' |
sort | uniq -c | sort -rn

产生

   3 A
   2 B

顺便说一句,即使是普通的传统grep也可以做到这一点,至少在一些方言中是如此;只提供多个-e选项;

grep -v -e ABC -e XYZ file

答案 1 :(得分:2)

当需要具体说明字符串时,使用正则表达式字(\b)边界是有帮助的:

\bABC\b|\bXYZ\b

例如,如果您的文件包含:

ABCXYZ
XYZ ABC
ABZ

使用以下内容将导致输出第1行和第3行:

grep -E -v '\bABC\b|\bXYZ\b' file

不使用字边界,您也不会输出ABCXYZ,而不是ABCXYZ

答案 2 :(得分:0)

使用sed

的解决方案
sed '/ABC\|XYZ/d' ip.csv
  • /ABC\|XYZ/匹配包含ABCXYZ
  • 的行
  • d命令删除这些行

如果您需要以不区分大小写的方式搜索这些字词,请使用I标记

sed '/ABC\|XYZ/Id' ip.csv