对于以下几行,我只需要过滤掉协议、端口和服务。
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