Awk 명령 - 두 명령 결합

Awk 명령 - 두 명령 결합

나는 내가 작성하고 있는 bash 스크립트에서 변수를 조작하는 방법을 배우는 과정에서 천천히 길을 찾고 있습니다. iftop에서 소스와 대상을 추출하기 위해 AWK(Grep을 시도했지만 충분하지 않은 것 같습니다)를 사용하려고 합니다.

내가 사용하는 기본 iftop 명령은 다음과 같습니다.

sudo iftop -t -L1 -s1 -f "dst host 10.0.0"

반대 결과를 얻기 위해 dst를 src로 전환할 수 있습니다. 따라서 위 명령의 출력 예는 다음과 같습니다.

interface: eth0
IP address is: 10.0.0.104
MAC address is: b8:27:eb:6a:26:84
Listening on eth0
   # Host name (port/service if enabled)            last 2s   last 10s  last 40s cumulative
--------------------------------------------------------------------------------------------
   1 10.0.0.255                               =>         0b         0b         0b         0B
     10.0.0.15                                <=     1.14Kb     1.14Kb     1.14Kb       291B
--------------------------------------------------------------------------------------------
Total send rate:                                       480b       480b       480b
Total receive rate:                                  1.29Kb     1.29Kb     1.29Kb
Total send and receive rate:                         1.76Kb     1.76Kb     1.76Kb
--------------------------------------------------------------------------------------------
Peak rate (sent/received/total):                       480b     1.29Kb     1.76Kb
Cumulative (sent/received/total):                      120B       331B       451B
============================================================================================

저는 AWK를 사용하여 두 개의 IP 주소(또는 도메인)를 bash에서 일부 작업을 수행할 수 있는 변수로 출력하려고 합니다.

다음 명령을 사용하는 경우:

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 / {print $2}'

이렇게 하면 첫 번째 IP 또는 도메인이 제공되지만 이제 두 번째 행이 필요합니다. 나는 다음과 같은 것을 사용해 보았습니다.

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 /{c=2} c&&c-- {print $2}'

이것은 거의 작동하지만 두 번째 행의 흰색 간격으로 인해 AWK는 첫 번째 행의 열 2를 두 번째 행의 열 1로 계산하므로 내가 얻는 출력은 다음과 같습니다.

10.0.0.255
<=

가까워진 것 같은 느낌이 들지만 단일 AWK 명령을 사용하여 올바른 두 숫자를 뱉어내는 방법을 모르겠습니다.

IP나 도메인 앞에 공간이 부족해서 두 번째 숫자에 대한 두 번째 패턴 비교를 진행하기가 쉽지 않아서 이상적으로는 첫 번째 숫자를 일치시킨 후 다음 줄로 넘어가고 싶지만 선택 두 번째 열 대신 1번째 열입니다.

또한 결과가 첫 번째 명령과 다를 수 있으므로 두 번째 iftop 명령을 실행하는 것을 피하고 싶습니다.

그런 다음 화면에 인쇄하는 대신 bash 스크립트의 변수로 변환하는 방법을 알아야 합니다.

어떤 아이디어가 있나요?

답변1

노력하다

 ... | awk '$1 == "1" {print $2 ; l=NR+1 ; } NR == l { print $1 ;}'

어디

  • $1 == "1" 첫 번째 필드가 1인 행을 선택합니다.
  • {print $2 그 가치를 인쇄하다
  • l=NR+1 ; }다음 줄 기억해
  • NR == l두 번째 행 선택
  • { print $1 ;}첫 번째 필드 인쇄

awk는 열을 고려하지 않고 필드만 고려한다는 점을 기억하세요.

이 두 줄은 다음을 사용하는 것과 같습니다.$1 $2

 hello world
       hello              world

var에 할당됨

... | awk '$1 == "1" {printf "A=%s\n",$2 ; l=NR+1 ; } NR == l { printf "B=%s\n",$1 ;}' > /tmp/.var
. /tmp/.var

마지막 줄은 점( .), 공백( ) 및/tmp/.var

  • awk의 printf에는 매개변수 뒤에 쉼표가 필요합니다.

답변2

다음을 사용할 수 있습니다.

sudo iftop -t -L1 -s1 -f "dst host 10.0.0" | grep -E '=>|<=' | cut -c 5- | awk '{ print $1 }'

반품:

10.0.0.255
10.0.0.15

문제는 다음 두 행의 "열" 수가 서로 다르다는 것입니다. 위 명령은 cut처음 5자를 제거하는 데 사용되므로 "1"이 제거됩니다.

 1 10.0.0.255                         =>         0b         0b         0b         0B
   10.0.0.15                          <=     1.14Kb     1.14Kb     1.14Kb       291B

답변3

그리고 grep:

... | grep -oP '^\s+\d* \K(\d+\.){3}\d+'
10.0.0.255
10.0.0.15

관련 정보