显示不包含特定字符串linux的行

时间:2015-06-05 13:01:37

标签: linux awk sed grep

我的服务器linux中有一个带有此字符的文本文件;

  ID              DATA
MF00034657,12435464^DRogan^DPUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;M-DT_MAX_1;
MF00056578,12435464^DRogan^DPUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;PUM-DT_MAX_1234;UM-DT_MAX_123;

现在我需要过滤不包含" PUM-DT_MAX_1234"的行。并保存在ID为

的另一个文件中

喜欢这个

MF00034657,M-DT_MAX_1
MF00056578,UM-DT_MAX_123

我用

grep -v 'PUM-DT_MAX_1234' file > file.out
awk '!/PUM-DT_MAX_1234/' file > file.out

但不工作

任何建议

谢谢!

5 个答案:

答案 0 :(得分:15)

使用awk '$0 !~ /your_pattern/'

作为(可能)最大found

中的awk doc

答案 1 :(得分:2)

如果我理解您的问题,您希望删除任何包含" PUM-DT_MAX_1234"那么你必须遍历你的行中的每个字段:

awk -F "[;,]" -v OFS="," 'NR==1 { next; }; { for (i=1;i<=NF;i++) { if(!match($i,/.*PUM-DT_MAX_1234.*/) && length($i) > 0) { if (i==1) r=$i;  else r = r OFS $i }}; print r }' filter.txt

在一个更具可读性的评论视图中:

  • -F "[;,]"将字段分隔符设置为;,
  • -v OFS=","将输出分隔符设置为,
  • 'NR==1 { next; }; '启动awk脚本,其余的是跳过文件的标题(如果记录号为1,则停止并转到下一行
  • { for (i=1;i<=NF;i++) {迭代字段数(NF
  • if(!match($i,/.*PUM-DT_MAX_1234.*/) && length($i) > 0) {如果该字段不为空且与文字
  • 不匹配
  • if (i==1) r=$i; else r = r OFS $i将字段连接到上一个字段(或者只设置第一个字段以避免输出中的前导字段)
  • print r }'一旦循环结束,打印上一个连接的结果,并以'为shell结束awk脚本
  • filter.txt最后一个参数是文件名。

OFS O 输出 F ield S eparator,因此您可以通过更改命令中的变量来更改它线。

例子的输出:

MF00034657,M-DT_MAX_1
MF00056578,UM-DT_MAX_123

答案 2 :(得分:1)

sed '1b
h;s/.*DRogan^D//;s/PUM-DT_MAX_1234;\{0,1\}//g;s/;$//;/./!d
H;g;s/,.*\n/,/' YourFile
  • 基于您的样本

概念: - 保留一行副本 - 从线上移除头部和任何PUM,检查是否有东西停留 - 返回标题(从缓冲行)并使用reduce行重新格式化

答案 3 :(得分:1)

我将使用命令ls对你的问题进行类比(因为它很容易实现),假设我想要显示所有不是mp4的命令,你可以执行以下操作:

ls | awk '! /\.mp4/'

如果您想进一步了解这些选项,我实际上可能正在寻找 包含mp4扩展名的文件< strong> 包含特定字符串,例如abc

ls | awk '! /\.mp4/ &&  /abc/'

这应该是类似的,适用于您的目的(或者至少,不难实施)。

答案 4 :(得分:0)

在上面的答案@silgon中,该命令在我删除'!中的空格后起作用了! /.mp4 /'

  • 我想使用awk从“ docker images”输出中删除“无”图像:

docker images | awk '!/\<none>/' 

  • 我只想使用awk从“ docker images”输出中打印名称和标签,即也从不包括“ none”图像的输出中打印第1列和第2列:

docker images | awk '!/\<none>/' | awk '{print $1,$2}'