나는 내가 작성하고 있는 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