2014-10-21 2 views
0

ip addr | grep ether -B1에서 오는이 데이터가 있으면 설정합시다.sed/awk : 매 2 줄마다 패턴 매칭하고 한 줄로 집계

11: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 
    link/ether fe:54:4c:8e:df:f0 brd ff:ff:ff:ff:ff:ff 
12: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 
    link/ether fe:54:7a:d0:1a:04 brd ff:ff:ff:ff:ff:ff 
13: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 
    link/ether fe:54:00:29:ef:0c brd ff:ff:ff:ff:ff:ff 
14: vnet3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 
    link/ether fe:54:be:c6:c3:32 brd ff:ff:ff:ff:ff:ff 
15: vnet4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 
    link/ether fe:54:e8:cf:ff:ef brd ff:ff:ff:ff:ff:ff 

그리고 <interface> <hwaddr>의 형태로 요약 할 :

vnet0 fe:54:4c:8e:df:f0 
vnet1 fe:54:7a:d0:1a:04 
vnet2 fe:54:00:29:ef:0c 
vnet3 fe:54:be:c6:c3:32 
vnet4 fe:54:e8:cf:ff:ef 

내가 sed 또는 awk와 함께 하나의 bash는 명령을 사용하여이를 달성 할 수 있습니까? 미리 감사드립니다.

답변

1

,

$ awk '/^[0-9]+: +/{split($2,a,":");var=a[1];next}{print var,$2}' file 
vnet0 fe:54:4c:8e:df:f0 
vnet1 fe:54:7a:d0:1a:04 
vnet2 fe:54:00:29:ef:0c 
vnet3 fe:54:be:c6:c3:32 
vnet4 fe:54:e8:cf:ff:ef 

설명 : 라인은 콜론을 더한 다음에 하나 개 이상의 숫자로 시작

  • /^[0-9]+: +/ 경우 또는 그 이상의 공간이 있으면 블록 내에 존재하는 코드를 실행한다.:하고 연관 배열 a

  • var=a[1]; 저장소 가변 var에 배열 인덱스 값 1로 저장 구분자에 따른

    • split($2,a,":"); 분할 칼럼 (2)의 값 73,. 즉, vnet\d+을 변수 var
    • next에 저장합니다. 다음 명령문은 awk가 즉시 현재 레코드 처리를 중단하고 다음 레코드로 이동하도록합니다. 이것은 현재 레코드에 대해 더 이상의 규칙이 실행되지 않으며 현재 규칙의 나머지 작업이 실행되지 않는다는 것을 의미합니다.
  • {print var,$2}

  • 변수 var 더한 다음 행의 열 값이 저장된 값을 출력.

+0

정말 고마워요! 예상대로 작동합니다. 그리고 설명은 다음과 같습니다. 매우 직관적입니다. –

1

간단한 awk 스크립트가 목적을 수행 할 수 있습니다.

awk '$2~/vnet[0-4]/{inter=$2; next} {print inter,$2}' inputFile 

은 무엇

vnet0: fe:54:4c:8e:df:f0 
vnet1: fe:54:7a:d0:1a:04 
vnet2: fe:54:00:29:ef:0c 
vnet3: fe:54:be:c6:c3:32 
vnet4: fe:54:e8:cf:ff:ef 

로 출력을 produe 것인가?

검사 번째 열 $2 패턴 vnet[0-4]을 일치 결과 경우이므로

inter=$2; next 가변 internext에 대한 인터페이스를 지정하면, 나머지 동작을 고려하지 않고 다음 레코드를 읽어 AWK시킨다.

print inter,$2 인쇄 인터페이스와 HWADDR AWK를 통해

+0

정말 고마워요. 이것은 예상대로 작동합니다! 하지만 Raj의 답변은 좀 더 일반적입니다 (단지'vnet [0-4]'를 찾지 않기 때문에 받아 들일 수 있습니다) –

1

당신 (GNU이 나오지도)에 대한이 작동 할 수 있습니다 : 한 번에

sed -r 'N;s/\S+\s+(\S+):.*(..:..:..:..:..:..) .*/\1 \2/' file 

읽기 두 줄과 필요한 데이터를 추출하는 패턴 매칭/다시 참조를 사용합니다.

+0

멋진 대답입니다! 고마워요.이게 내가 원하는거야! 이제 GNU sed의 다음 줄에'N'을 안다. –