从bash中删除给定行中的特定内容

时间:2017-04-10 07:36:22

标签: bash shell

我将以下内容作为输出

2017-04-10 12:23:00.307411 IP 124.108.16.209.443 > 192.168.180.3.44526: tcp 1209    
2017-04-10 12:23:00.836184 IP 192.168.180.3.43095 > www.facebook.com.443: tcp 303   
2017-04-10 12:23:09.948709 IP www.facebook.com.443 > 192.168.180.3.47172: tcp 38    
2017-04-10 12:23:09.986789 IP 192.168.180.31.47172 > www.facebook.com.443: tcp 0       

我想要这样的输出,

2017-04-10 12:23:00 IP 192.168.180.3 > www.facebook.com   
2017-04-10 12:23:09 IP 192.168.180.31 > www.facebook.com  

并且重要的是要删除以 IP 字后的字母开头的行,并删除那些在 IP 字后不以192.168.180开头的行,基本上是从上面例如我只想要第2行和第4行作为输出。

3 个答案:

答案 0 :(得分:1)

  

删除 IP 字后以字母开头的行   在 IP

之后删除不以 192.168.180 开头的那一行

awk 方法:

awk '$4!~/^[[:alpha:]]/ && $4~/^192\.168\.180/' file

space是 awk 中的默认字段分隔符。

$4!~/^[[:alpha:]]/
$4 - 第四场 !~ - 不匹配
/^[[:alpha:]]/ - 正则表达式,表示“以字母字符开头”

&& - 布尔“和”运算符。
boolean1&& boolean2 - 如果 boolean1 boolean2 都为真,则为真。

$4~/^192\.168\.180/ - 如果第四个字段以192.168.180

开头,则匹配一行

其他方法:

要剥离某些列的不需要的部分,请使用以下方法:

awk -v p=".[^.]+$" '$4!~/^[[:alpha:]]/ && $4~/^192\.168\.180/
     {$7=$8="";for(i=2;i<=6;i+=2)gsub(p,"",$i);print}' file

输出:

2017-04-10 12:23:00 IP 192.168.180.3 > www.facebook.com  
2017-04-10 12:23:09 IP 192.168.180.31 > www.facebook.com 

答案 1 :(得分:1)

我想 - 删除在IP字后以字母开头的行,意味着(基本上)与保持以数字开头的行相同的东西 删除在IP字之后不以192.168.180开头的行,意味着保留其中包含IP 192.168.180的行,并且基本上使第一个要求过时。 man grep

DESCRIPTION
       grep searches the named input FILEs for lines containing a match to the
       given PATTERN. - - By default, grep prints the matching lines.

尝试:

grep "IP 192.168.180" file
2017-04-10 12:23:00.836184 IP 192.168.180.3.43095 > www.facebook.com.443: tcp 303
2017-04-10 12:23:09.986789 IP 192.168.180.31.47172 > www.facebook.com.443: tcp 0

答案 2 :(得分:0)

你可以试试这样的东西,它只是语法:

sed -e '/pattern here/ { N; d; }'

N和d是您可以使用的命令。

在模式之后删除1行(包括带有模式的行):

patter =你的字符串

sed -e '/pattern/,+1d' file.txt