bash 명령의 출력을 캡처하고 구문 분석하여 다른 bash 변수에 저장합니다.

bash 명령의 출력을 캡처하고 구문 분석하여 다른 bash 변수에 저장합니다.

설명하다:

나는 조금있다세게 때리다스크립트를 실행해 보세요.어느Linux 명령(예 ifconfig: )

일반적인 출력은구성된 경우다음과 같습니다:

eth0      Link encap:Ethernet  HWaddr 30:F7:0D:6D:34:CA
          inet addr:10.106.145.12  Bcast:10.106.145.255  Mask:255.255.255.0
          inet6 addr: fe80::32f7:dff:fe6d:34ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1104666 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2171 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:444437904 (423.8 MiB)  TX bytes:238380 (232.7 KiB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.255.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:15900 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15900 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:467306 (456.3 KiB)  TX bytes:467306 (456.3 KiB)

요즘 사람들이 주로 하는 일은 쇼핑이다.모두파일/변수로 출력하고 이를 기반으로 구문 분석합니다. 그런데 혹시 넣을 수 있는 게 있을까 해서요.특정한출력의 일부가 여러 변수에 포함됩니다(예:배쉬 변수${IPETH0}IP 10.106.145.12주소를 전달하기 위해 호출됩니다.이더넷 0그리고 ${IPLO}IP 127.0.0.1주소를 가지고루오위의 예에서ifconfig 명령을 두 번 실행할 필요가 없습니다.).

마치입력을 처리하는 명령을 실행하고 싶지만산출출력을 2 또는변수를 한 번에. 어떤 아이디어가 있나요?

답변1

답변을 얻었습니다.

$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }' | cut -d ':' -f 2)
$ echo "${IPETH0}"
192.168.23.2
$ echo "${IPLO}"
127.0.0.1

eth0이는 인터페이스의 순서를 가정 lo하지만 기본 아이디어를 보여줍니다.

순수한awk

awk특히 이 split기능을 사용하여 다음을 수행 할 수 있습니다 .

$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { split($2,a,":"); print a[2]}')

답변2

각 명령에 대해 저장하려는 명령 반환 부분을 알고 있다고 가정합니다.

귀하의 예에서는 단어 7과 47이 됩니다.

다음을 수행하십시오(명령 주위의 백틱에 유의하십시오 ifconfig).

array=(`ifconfig`)

배열의 모든 요소를 ​​표시합니다.

echo ${array[@]}
eth0 Link encap:Ethernet HWaddr 30:F7:0D:6D:34:CA inet addr:10.106.145.12 Bcast:10.106.145.255 Mask:255.255.255.0 inet6 addr: fe80::32f7:dff:fe6d:34ca/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1104666 errors:0 dropped:0 overruns:0 frame:0 TX packets:2171 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:444437904 (423.8 MiB) TX bytes:238380 (232.7 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.255.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:15900 errors:0 dropped:0 overruns:0 frame:0 TX packets:15900 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:467306 (456.3 KiB) TX bytes:467306 (456.3 KiB)

특정 단어 표시:

echo ${array[6]} ${array[46]}
addr:10.106.145.12 addr:127.0.0.1

결과를 sed로 파이프하여 IP 주소만 추출합니다.

echo ${array[6]} ${array[46]} | sed 's/addr://g'
10.106.145.12 127.0.0.1

Arpith의 영리한 접근 방식과 "읽기"를 사용하는 것이 여기서 유연한 대답입니다.

read IPETH0 IPLO <<< $(echo ${array[6]} ${array[46]} |\
sed 's/addr://g')
echo $IPETH0 $IPLO
10.106.145.12 127.0.0.1

배열 요소는 0부터 계산됩니다. 따라서 단어 번호 7은 "${array[6]}"이라고 합니다.

배열 인덱스는 양의 정수입니다. 따라서 쉘 스크립트에서 다양한 계산을 수행하여 특정 단어(예: 범위 또는 for 루프)를 선택할 수 있습니다.

이식 가능한 스크립트를 작성하려면 이러한 숫자를 테이블로 유지해야 합니다. 내 시스템(BSD)에서 IP 주소는 Linux 번호 7과 47이 아닌 숫자 17과 49입니다. 결과 문자열은 다르게 보입니다(내 로컬 및 Arpith의 전역 ID 주소는 무시함).

echo ${array2[16]}
192.168.0.103

echo ${array2[48]}
127.0.0.1

slm의 "순수한 awk" 접근 방식(아래 참조)이 내 BSD 시스템에서 실패합니다. 함수를 배열로 분할하면 "ifconfig" 명령이 "127.0.0.1"과 Arpith의 "addr:127.0.0.1"을 인쇄하므로 작동하지 않습니다...

read IPETH0 IPLO <<< $(ifconfig |\
 awk '/inet[[:space:]]/ { split($2,a,":"); print a[2]}')

화타이

버니

답변3

이를 수행하는 일반적인 방법은 awk일부 코드를 생성 bash하고 bash.

좋다:

eval "$(
  ifconfig | awk -F '[: ]+' '
    /^[^[:blank:]]/ {iface=$1}
    /inet addr:/ {ip[iface]=$4}
    END {for (i in ip) print "IP" toupper(i) "=" ip[i]}')"

답변4

AWK:

/sbin/ifconfig | awk -F':' 'NR==2{split($2,a," "); print a[1]}'

SED:

ip -f inet addr show dev eth0 | sed -n 's/^ *inet *\([.0-9]*\).*/\1/p'

또는

ifconfig eth0 | sed -n 's/^ *inet addr:*\([.0-9]*\).*/\1/p'

그렙:

ifconfig eth0|grep -Po 't addr:\K[\d.]+'

@Stephane Chazelas에게 감사드립니다.

관련 정보