如何过滤多个字符串

如何过滤多个字符串

对于以下几行,我只需要过滤掉协议、端口和服务。

tcp 127.0.0.1:25  1147/master
tcp 0.0.0.0:443  1039/nginx:
tcp 127.0.0.1:8001  1218/python
tcp 0.0.0.0:10050  939/zabbix_agentd
tcp 127.0.0.1:6379  891/redis-server
tcp 0.0.0.0:80  1039/nginx:
tcp 0.0.0.0:22  889/sshd
tcp 127.0.0.1:5432  929/postmaster
udp 127.0.0.1:323 645/chronyd

我需要这样的:

tcp 25 master
tcp 443 nginx
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx
tcp 22 sshd
tcp 5432 postmaster
udp 323 chronyd

答案1

这看起来更简单、更容易记住。 AWK 的选项-F允许您提供一个正则表达式类,其中包含需要拆分的字符。

awk -F'[ :/]' '{print $1,$3,$5}' file

史蒂夫(如下)提到了一种比我最初想到的更短的方法:

  • 而不是cat file | ...仅仅将文件放在最后。
  • 美元项目之间的逗号会添加空格。

答案2

这是一种方法:

sed -re 's/[^ ]+://' -e 's# +[0-9]+/# #' -e 's/:$//'

解释:

  • sed -r- 在扩展正则表达式模式下使用 sed
  • -e 's/[^ ]+://'- 向后删除第一个冒号之前的所有内容,直到一个空格
  • -e 's# +[0-9]+/# #'- 将任意数量的空格、数字和斜杠替换为单个空格
  • -e 's/:$//'- 从行尾删除冒号

答案3

cat file | sed 's/[:/]/\t/g' | awk '{print $1 " " $3 " " $5}'
tcp 25 master
tcp 443 nginx
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx
tcp 22 sshd
tcp 5432 postmaster
udp 323 chr

sed 's/[:/]/\t/g' convert `:` and '/` to tab

答案4

与一个awk

$ awk '{ print $1, gensub( /^.*:/, "", "1", $2 ), gensub( /[0-9]+\//, "", "1", $3 ) }' input
tcp 25 master
tcp 443 nginx:
tcp 8001 python
tcp 10050 zabbix_agentd
tcp 6379 redis-server
tcp 80 nginx:
tcp 22 sshd
tcp 5432 postmaster
udp 323 chronyd

相关内容