무선 신호 레벨과 주파수를 모니터링하고 CSV 형식으로 기록하려면 어떻게해야합니까? ‘freq:\|signal’ |

iw dev wlan0 link매 초마다 명령을 계속 실행 하고 출력을 csv파일 로 저장하고 싶습니다 .

다음 명령을 사용하고 있습니다.

while sleep 1; do
  iw dev wlan0 link | grep 'freq:\|signal' | awk '{printf "%s ", $2, $3}' >> log.csv
done

그러나 출력은 log.csv다음과 같은 방식으로 저장됩니다 .

2412 -41 2412 -42 2412 -45 2412 -43

두 필드가 쉼표로 구분되어 (MS Excel과 같은 편집기의 별도 열에 표시됨) 각 줄이 새 줄로 출력되는 방식으로 출력을 저장하고 싶습니다. 는 log.csv(당신은 그들이 단지 설명을위한 라벨을 무시할 수 있습니다) 다음과 같이한다

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412


답변

실행할 때 iw help경고가 표시됩니다.

마십시오 하지 이 도구를 screenscrape, 우리는 그 출력 안정성을 고려하지 않습니다.

아래 에는 두 가지 섹션이 있습니다. 먼저 문제를 피하기위한 해결책 iw과 질문에 대한 답변입니다. 둘 다 전통적인 awk것과 함께 작동 합니다 (기본값) GNU Awk.

문제에 대한 해결책

iwconfig대신에 사용 합니다 iw:

while sleep 1; do
  iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv

산출

$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412

노트

값을 ,탭으로 구분할지 또는 탭으로 구분 할지를 혼란스럽게 \t생각했습니다 ,. 여기서는 공백없이 선택했습니다 . 그 방금 변경 원하는 것을 아니라면 s","f따라서 s는 IS Signal와 가치가있다.
또한 리디렉션을 이동하여 각 실행에서 파일을 한 번만 열 필요는 없습니다.fFrequency

awk부품 설명

  • -F'[ :=]+'+대괄호로 묶인 세 문자 중 하나 이상 ( )으로 다른 필드 구분 기호를 설정합니다.
  • /Freq/{gsub("\\.","");f=$5}–“Freq”가있는 줄에서 모든 점을 아무것도 바꾸지 말고 ( iwconfig출력 의 주파수 가 점을 천 단위 구분 기호로 사용 하기 때문에 ) 다섯 번째 열의 내용을 변수에 저장하십시오f
  • /Signal/{s=$7} –“Signal”이있는 행에서 일곱 번째 열의 내용을 변수에 저장하십시오. s
  • END{print s","f}– 입력을 처리 한 후 print변수 s와 변수 f사이에 리터럴 쉼표가 있습니다.

질문에 대한 답변

while sleep 1; do
  iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv

산출

$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412

awk부품 설명

  • /freq/{f=$2}–로 표시된 행 freq에서 두 번째 열 (공백으로 구분)을 변수에 저장하십시오.f
  • /signal/{s=$2}–로 표시된 행 signal에서 두 번째 열을 변수에 저장하십시오.s
  • END{print s","f}– 입력을 처리 한 후 print변수 s와 변수 f사이에 리터럴 쉼표가 있습니다.