출력에서 후행 콜론을 제거하기 위해 이 sed 명령을 어떻게 수정합니까?

출력에서 후행 콜론을 제거하기 위해 이 sed 명령을 어떻게 수정합니까?

Centos 7 서버에 이더넷 인터페이스를 표시해야 합니다. Centos 6.5에서는 (다른 게시물의) 이 명령을 사용했는데 6.5에서는 제대로 작동했습니다.

ifconfig -a | sed  -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo 

Centos 7에서는 이제 인터페이스 출력에 ":"가 붙습니다.

그래서 내 출력은 다음과 같습니다

ifconfig -a | sed  -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo
ens32:
lo:

"lo:" 제거 이것을 수정했습니다. 결과는 ens32입니다.

ifconfig -a | sed  -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo:
ens32:

끝에 있는 ":"을 어떻게 제거할 수 있나요? 이 sed를 수정할 수 있나요? 아니면 다른 아이디어

답변1

불행하게도 ifconfig 명령의 원시 출력을 제공하지 않았습니다. 하지만 나는 다음과 같은 일을 할 것입니다 :

$ ifconfig -a | perl -anle 'print $F[0] if /(^\w)/'
$  enp2s0f0
   lo
   tun0
   wlp3s0b1

원본 출력은 다음과 같습니다.

enp2s0f0  Link encap:Ethernet  HWaddr 3c:07:54:5f:5e:35  
          inet addr:192.168.1.114  Bcast:192.168.1.255 
[...] 

perl -anle, 여기서 'a'는 열의 줄을 분할하고 변수 $F를 채웁니다. 'n'은 출력을 한 줄씩 처리하고, 'l'은 각 인쇄 사이에 새 줄을 넣는 것이고, 'e'는 명령줄 Perl 명령을 실행합니다. 그런 다음 정규식에 따라 "^" 줄의 시작 부분에 "\w" 문자가 포함된 "//" 줄을 일치시키고 싶다고 말했습니다.

답변2

이는 콜론이 없는 이전 시스템에서 작동합니다.그리고콜론이 있는 새 시스템의 경우:

$ /sbin/ifconfig -a | awk -F'[ :]+' '$1 && $1!="lo" {print $1}'
eth0

또는 sed를 사용하세요. 이는 기존 시스템과 새 시스템에서도 작동합니다.

$ /sbin/ifconfig -a | sed -n 's/[ :].*//; /^lo$/t; /./p'
eth0

awk 또는 sed를 사용하는 경우 grep을 실행하기 위해 추가 프로세스가 거의 필요하지 않습니다.

awk 명령의 작동 방식

  • -F'[ :]+'

    이는 awk에게 연속된 공백이나 콜론을 필드 구분 기호로 처리하도록 지시합니다.

  • $1 && $1!="lo" {print $1}

    첫 번째 필드가 있고 이 필드가 없으면 lo인쇄합니다.

sed 명령의 작동 방식

  • -n

    이는 명시적으로 요청하지 않는 한 sed에게 아무것도 인쇄하지 않도록 지시합니다.

  • s/[ :].*//

    이는 sed에게 첫 번째 공백이나 콜론부터 줄 끝까지 모든 것을 제거하라고 지시합니다.

  • /^lo$/t

    행이 일치하면 lo나머지 명령은 건너뛰고 다음 행에서 시작됩니다.

  • /./p

    줄에 문자가 포함되어 있으면 해당 줄을 인쇄합니다.

관련 정보