
내가 하고 싶은 일은 간단하다. 출력을 생성 tshark
하고 이를 awk
파이프 로 리디렉션하고 있습니다 |
. tshark
실시간 데이터를 가져오고 있으므로 awk
각 출력에서 파일의 첫 번째 열("target.txt")(이미 가지고 있는 일부 MAC 주소)의 패턴을 검색하고, 일치하는 항목이 있으면 awk
첫 번째 및 출력되어야 하는 파일의 두 번째 열입니다.
다음의 예 target.txt
:
ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone
이를 더 쉽게 하기 위해 tshark
출력에는 2개의 열만 있고 MAC 주소 열은 두 번째 열입니다.
1줄의 출력 tshark
은 다음과 같습니다.
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10
^^^^- date and MAC are separated by tab!
따라서 tshark
발견 12:34:56:78:90:10
되면 awk
출력됩니다.
12:34:56:78:90:10 -> You
또는 더 나은 방법은 다음과 같습니다.
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
편집 #1
글쎄, 나는 몇 가지 테스트를 했고 tshark
s 출력이 tab
\t로 구분된다는 것을 발견했습니다. 큰 문제는 아니지만 작은 개선입니다. 문제는 tshark
출력에서 샘플을 가져와 echo
이전에 명령을 파이핑하여 Gnoucs 응답을 사용하여 테스트했다는 것입니다 |
. 효율적인. 그런 다음 echo
for를 변경했고 tshark
모든 것이 작동을 멈췄습니다 =).
실시간 데이터나 이와 유사한 문제인가요? 이것은 지금까지 내 코드입니다.
$ tshark -I -i wlan0 -T fields -e radiotap.dbm_antsignal -e wlan.sa | awk -F'[ ,\t]' '
FNR == NR { a[$1] = $2 }
($NF in a) { print $0" -> "a[$NF] }
' alvos.txt -
글쎄요, 방금 성공했어요! 오타일 수 있습니다. 모든 답변에 감사드립니다!
답변1
이 시도:
$ awk -F'[ ,\t]' '
FNR == NR { a[$1] = $2 }
($NF in a) { print $0" -> "a[$NF] }
' target.txt -
예:
$ awk -F'[ ,\t]' '
FNR == NR { a[$1] = $2 }
($NF in a) { print $0" -> "a[$NF] }
' target.txt -
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 # Ctrl + D here
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
설명하다
-F[ ,\t]
: 필드 구분자로 쉼표, 공백 또는 탭을 사용합니다.FNR == NR { a[$1] = $2 }
:FNR == NR
첫 번째 파일을 처리할 때만 True입니다. 따라서 의 각 행에 대해target.txt
두 번째 필드를 연관 배열에 저장하고 첫 번째 필드(MAC 주소)는 인덱스입니다.($NF in a)
: 입력을 읽을 때( 입력에서 읽은 후) 마지막 필드가 연관 배열에 있으면 원하는-
결과 를 인쇄합니다.target.txt
awk
a
답변2
내가 올바르게 이해했다면 다음 중 하나라도 최소한 원하는 결과를 얻을 것입니다.
${TSHARK} |
sed -n "$(IFS=',
'; printf '/%s/s//& -> %s/p\n' \
$(cat target.txt)
)"
${TSHARK} |
sed -n "$(
sed 's/,/|s||\& -> /
s/.*/\\|&|p/
' <target.txt
)"
나는 이것을 다음과 같이 테스트했습니다.
printf 'ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone' >./target.txt
printf 'Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10' |
sed ...
이것은 내 결과입니다.
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
답변3
#!/usr/bin/env awk
# filename ~/mac-lookup.awk
function load_mac_list (filename, array) {
while ((getline line < filename) > 0) {
split(line, fields, ",");
array[fields[1]] = fields[2];
}
close(filename)
}
BEGIN {
load_mac_list("target.txt", mac_list);
}
($5 in mac_list) {
print $0 " -> " mac_list[$5];
next;
}
{
print; # remove this line to avoid printing unmatched lines
}
이것은 무차별적인 접근 방식입니다. 대상 파일을 로드한 다음 mac 주소가 목록에 있는 경우에만 mac 별칭을 인쇄합니다.
이 경우 "target.txt"는 awk 스크립트에 하드코딩되어 있습니다. Gnouc의 답변에서 필요한 경우 대상 목록 파일 이름을 스크립팅할 수 있습니다.
용법
$ ${TSHARK} | awk -f ~/mac-lookup.awk
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
Jun 16, 2014 02:55:51.300286010 zy:xw:vu:ts:rq:po
Jun 16, 2014 02:55:51.300286020 ab:cd:ef:gh:ij:kl -> Me