grep非匹配端口@ server

时间:2016-06-24 11:19:39

标签: regex linux grep

我想要一个下面输入的正则表达式

echo "1280@lic1 1728@lic1 1280@lic2.local 1924@lic1"| grep -Po 'regexp'

我希望输出为不包含1280的单词

1728@lic1 1924@lic1

3 个答案:

答案 0 :(得分:1)

您可以使用此前瞻和后瞻性正则表达式:

echo "1280@lic1 1728@lic1 1280@lic2.local 1924@lic1"| grep -Po '(?<=\s|^)(?!\S*1280)\S+'

1728@lic1
1924@lic1
  • (?<=\s|^)在我们的比赛之前断言空格或线开始
  • (?!\S*1280)声称单词
  • 中没有1280

如果要从此输出中删除换行符,请将结果传递给tr '\n' ' '

答案 1 :(得分:1)

$ echo "1280@lic1 1728@lic1 1280@lic2.local 1924@lic1" | sed 's/1280@[.a-z0-9]*//g'
 1728@lic1  1924@lic1

sed命令将删除您不想要的所有字符串。

您不能直接使用grepgrep逐行工作。 -o grep标记将允许您返回每个匹配的单词,但-v标记(以取消匹配)仅适用于整行。如果您想以这种方式执行,则必须向grep询问您想要查看的所有匹配项(除非您使用Perl正则表达式“作弊”,这是grep的GNU扩展名)

或者,您可以分解grep几行的输出,并以这种方式执行:

$ echo "1280@lic1 1728@lic1 1280@lic2.local 1924@lic1" | tr ' ' '\n' | grep -v '1280'
1728@lic1
1924@lic1

答案 2 :(得分:0)

您可以使用sedgrep获取所需的输出。

echo "1280@lic1 1728@lic1 1280@lic2.local 1924@lic1"| sed 's/1280@[0-9,a-z,A-Z,.]\+//g' | grep -Po '\d+@[A-Z,a-z,0-9,\.]+'

希望这对你有用。