Linux

如何過濾多個字元串

  • October 6, 2018

對於以下幾行,我只需要過濾掉協議、埠和服務。

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

這是一種方法:

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

解釋:

  • sed -r- 在擴展正則表達式模式下使用 sed
  • -e 's/[^ ]+://'- 向後刪除第一個冒號之前的所有內容,直到一個空格
  • -e 's# +[0-9]+/# #'- 用單個空格替換任意數量的空格、數字和斜線
  • -e 's/:$//'- 從行尾刪除一個冒號

這似乎更簡單易記。-FAWK 選項允許您提供一個正則表達式類,其中包含您需要拆分的字元。

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

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

  • 而不是cat file | ...只是把文件放在最後。
  • 美元項目之間的逗號添加空格。

引用自:https://unix.stackexchange.com/questions/473538