답변1
ifconfig
출력에는 각 인터페이스 사이에 빈 줄이 awk
있으므로 perl
. "단락"은 하나 이상의 빈 줄로 다른 블록과 구분된 텍스트 블록입니다.
예를 들어:
ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'
awk
위의 예에서는 레코드 구분 기호( )를 awk
빈 RS
문자열로 설정하여 개별 줄이 아닌 단락을 처리하도록 합니다. 이 경우 각 단락이 일치하는지 테스트 ^s1-eth[12]:
하고 일치하면 인쇄됩니다.
내 시스템의 출력 예:
$ ifconfig | awk -v RS='' '/^(ppp0|lo):/ {print}'
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 64237556 bytes 36962222928 (34.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 64237556 bytes 36962222928 (34.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1412
inet ip.ip.ip.ip netmask 255.255.255.255 destination ip.ip.ip.ip
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 28220997 bytes 19305565357 (17.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21719890 bytes 3009382446 (2.8 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
더 이상 단락 단위로 인쇄되지 않습니다. 각 인터페이스 "레코드" 사이에 빈 줄이 없습니다. 출력에 단락을 포함하려면 출력 레코드 구분 기호( ORS
)를 두 개의 줄 바꿈( \n\n
)으로 설정합니다. 예를 들어
ifconfig | awk -v RS='' -v ORS='\n\n' '/^(ppp0|lo):/ {print}'
ip
의 대신 의 출력을 사용하여 유사한 작업을 수행하는 것은 ifconfig
약간 더 복잡합니다. ip
깔끔한 단락으로 구분된 출력을 생성하지 않습니다. 그러나 각 인터페이스를 블록으로 출력합니다. 여기서 인터페이스 번호 뒤에는 콜론, 줄 시작 부분의 공백, 해당 인터페이스에 대한 나머지 세부 정보가 옵니다.
이 기능을 활용하려면 RS를 정규식( (^|\n)[0-9]+:
)으로 설정하세요. 뒤에 콜론과 공백( )이 오는 모든 [0-9]+:
숫자 와 일치합니다.누구나파일의 시작 부분( ^
첫 번째 레코드와 일치하기 위해, 그렇지 않으면 건너뛰게 됨) 또는 개행 바로 뒤.
예를 들어 내 시스템에서는 다음과 같습니다.
$ ip addr | awk -v RS='(^|\n)[0-9]+: ' '/^(lo|eth0):/ {print}'
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 01:33:ed:b0:13:a9 brd ff:ff:ff:ff:ff:ff
(내 eth0
IP 주소는 가상 머신과 도커 컨테이너 사이의 브리지로 설정했기 때문에 IP 주소가 없습니다. IP 주소는 인터페이스에 있습니다 br0
.)
답변2
다음을 사용하여 일치하는 줄을 인쇄할 수 있습니다.grep -An
N다음은 행의 수가 다를 수 있으므로 약간 지저분합니다.
더 유용할 수도 있습니다 awk
. 그러면 enp1
또는 로 시작하는 모든 부분이 인쇄됩니다 enp3
. 첫 번째 규칙은 !/^ / {p=0}
줄이 공백으로 시작하지 않으면 변수를 지웁니다. 두 번째 규칙은 줄이 우리가 원하는 인터페이스 이름으로 시작하면 변수를 설정한 다음 설정 여부를 인쇄합니다. 공백으로 시작하는 줄은 마지막 규칙과만 일치하므로 이전 값을 기준으로 인쇄됩니다.p
/^enp[13]/ {p=1}
p
p
# /sbin/ifconfig -a |awk '!/^ / {p=0} /^enp[13]/ {p=1}; p'
enp1s0 Link encap:Ethernet HWaddr ...
inet addr:...
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:135284106 errors:0 dropped:0 overruns:0 frame:0
TX packets:144695 errors:0 dropped:0 overruns:0 carrier:2
collisions:0 txqueuelen:1000
RX bytes:8292624956 (8.2 GB) TX bytes:16595674 (16.5 MB)
enp3s0 Link encap:Ethernet HWaddr ...
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
귀하의 경우에는 물론 비슷한 패턴을 사용하게 됩니다 /^s1-eth/
.
답변3
예를 들어 다음으로 시작하는 모든 인터페이스에 대한 정보를 표시하고 싶습니다.
s1
사용 net-tools
:
ifconfig | grep s1 -A9
사용 iproute2
:
ip -s link | grep s1 -A7
답변4
후처리의 경우 최신 버전에서는 iproute2
이러한 목적으로 설계된 JSON 출력 형식을 사용할 수 있습니다.
ip -j -s link show |
jq -r '
.[]|
select(.ifname|test("^s\\d+-eth\\d+$"))|
[.ifname, .stats64.rx.bytes, .stats64.tx.bytes]|
@csv'
예를 들어 인터페이스 이름, RX 및 TX 바이트가 포함된 CSV 출력을 가져옵니다.