여러 문자열을 필터링하는 방법

여러 문자열을 필터링하는 방법

다음 줄에서는 프로토콜, 포트 및 서비스만 필터링하면 됩니다.

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

Steve(아래)는 제가 원래 생각했던 것보다 더 짧은 접근 방식을 언급했습니다.

  • 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

관련 정보