때로는 "키-값" 쌍이 포함된 명령에서 출력이 나오는 경우도 있습니다. 한 줄에 두 개 이상의 쌍이 있을 수도 있습니다. 재현 가능한 예로 다음 명령을 고려하십시오 ip addr show dev eth0
.
ip addr show dev eth0 | grep -v link/ether
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe0f:dbb3/64 scope link
valid_lft forever preferred_lft forever
mtu
이 예의 목적을 위해 , 및 ( inet
즉 brd
, 여기 및 1500
각각 ) 다음의 값을 캡처하고 싶을 수도 있습니다 . 각 키워드는 입력에 두 번 이상 나타나지 않는다고 가정할 수 있습니다.10.0.2.15/24
10.0.2.255
이 문제를 처리하는 유일한 방법은 소스 명령의 출력을 임시 변수로 캡처하고 모든 키워드가 처리될 때까지 해당 변수를 반복적으로 구문 분석하는 것입니다.
이러한 "키-값" 쌍을 선택하고 나머지 텍스트를 삭제하는 더 쉽고 더 나은 방법이 있습니까?
제안된 예는 순서가 지정되지 않은 출력을 제공합니다.
ip addr show dev eth0 | someCommand brd inet mtu
mtu 1500
inet 10.0.2.15/24
brd 10.0.2.255
답변1
키 이름이 최대 한 번만 나타난다고 가정하면 다음을 시도해 볼 수 있습니다.
ip addr show dev eth0 | perl -ne 'chomp; foreach $param (qw(mtu inet brd)) { /($param)\s+(\S+)/ && do { print "$1 $2\n"; }}'
답변2
다음은 각 단어를 한 줄에 배치하고 지정된 키 중 하나를 찾을 때마다 해당 키와 다음 단어를 인쇄하는 awk 솔루션입니다. 키는 실제로 전체 단어와 일치해야 하는 정규식입니다.
ip addr show dev eth1 |
tr -s ' ' '\n' |
awk -v keys='mtu|inet|brd' '
match($0, "^(" keys ")$") {printf "%s ", $0; getline; print}
'