2012-09-22 1 views
3

Python 스크립트에서 두 개의 짧은 UNIX 명령을 사용하여 주변 무선 액세스 지점에 대한 데이터를 얻고 있습니다.동일한 입력에 두 개의 greps 및 awk 적용

  • 는 N ° 1은 액세스 포인트의 ESSID를 얻는다 :

:

"iwlist NIC scan | grep ESSID | awk '{print $1}'"

  • N ° 2 액세스 포인트의 신호 강도를 얻는다 "iwlist NIC scan | grep level | awk '{print $3}'"

    내 문제는이 두 명령을 차례로 사용하여 "대칭"데이터를 생성하지 않는다는 것입니다. 6 개의 ESSID와 4 개의 신호 세기 데이터를 얻을 수 있습니다.

    스크립트가 처음으로 6 개의 AP (A, B, C, D, E 및 F)와 다음 번에 4 개의 AP (A, C, E 및 F)를 찾았습니다.

    • 방법을 "분할"다음 첫 번째 iwlist NIC scan 및 결과 동일한 입력에 두 개의 서로 다른 grepawk 시퀀스를 적용 있는가 :

      일부는 내 질문은 다음과 같다?

    적어도 대칭 목록 만 표시하면됩니다.

    미리 감사드립니다.

+1

먼저 iwlist 명령을 실행하여 임시 파일에 저장 한 다음 해당 파일에서'grep' +'awk' 명령을 실행합니다. 필요한 출력을 얻으면 파일을 삭제할 수 있습니다. – asgs

답변

1
#!/bin/bash 
iwlist <NIC> scan > tmpfile 
grep -i ESSID tmpfile | awk '{print $1}' 
grep -i level tmpfile | awk '{print $3}' 
rm tmpfile 

이 스크립트는 사용자가 기대하는대로 수행 할 수 있습니다.

+0

흠, 예, 좋은 생각 인 것 같습니다. 나는 이것을 할 수도있다. 빠른 답변을 보내 주셔서 감사합니다. –

+0

임시 파일이 유일하게 이름 지어 졌는지 (적어도 쉘 이름의'$$'를 포함하고, 쉘의 PID를 포함 함) 쉘을 시그널링했는지 확인하는 것을 잊지 마십시오 ('tmp = tmpfile . $$; trap "rm -f $ tmp; exit 1"0 1 2 3 13 15; ... 위와 같이 코드 ... rm $ tmp; trap 0'. 마지막에있는 'trap 0'은 트랩을 종료 할 때 스크립트가 성공적으로 종료되도록 허용 –

10

무엇 awkgrep로 사용하는 방법에 대한 :

iwlist NIC scan | awk '/ESSID/ {print $1} /level/ {print $3}' 

이 당신에게 ESSID를 제공하고 레벨 라인을 한 번에. 아마도 좀 더 정교 해지기를 원할 것입니다. 옵션은 군단입니다. 코드에서 출력을 사용하는 방법이 명확하지 않으므로 최선의 방법을 두 번째로 추측하지는 않을 것입니다.하지만 네트워크 ID와 레벨이 같은 줄에있을 것이라고 기대합니다. 좋은 결과물이 될 수 있습니다. 일반적으로

+1

예, 파일과 관련된 모든 것을 피하는 더 좋고 간단한 해결책입니다. – asgs

+2

예. 나는 특히 집중적 인 파일 I/O가 필요하지 않다는 사실을 좋아합니다. –

4

, 당신은 tee 및 프로세스 대체 사용하여 라우팅이 유형 수행 할 수 있습니다

iwlist NIC scan | tee >(grep -i ESSID | awk '{print $1}') | grep -i level | awk '{print $3}' 

을하지만, 이것은 여러 가지 이유로이 상황에서 열등하다 : awk 때문에,

  1. grep가 불필요 필터링 자체를 수행 할 수 있습니다.
  2. 두 개의 분기가 하나의 awk 명령으로 접힐만큼 충분히 유사합니다 (Jonathan Leffler는 지적합니다.
  3. 두 개의 출력 스트림이 비 결정적 방식으로 함께 병합되므로 어떤 수준이 어떤 ESSID에 해당하는지 결정하는 것이 어려울 수도 있고 불가능할 수도 있습니다.파일의 각 브랜치의 출력을 저장하고 나중에 한 줄씩 일치시키는 것이 도움이되지만, 이것은 asgs의 해결책보다 훨씬 낫지 않습니다.

그러나 다른 곳에서 유용 할 수있는 명시적인 임시 파일없이 두 개의 서로 다른 파이프 라인에 하나 개의 명령의 출력을 전달하는 기술; 이 답을 단지 데모라고 생각하십시오.

+0

+1 : 대답은 내가 작성한 것과 매우 흡사하며, 단점 목록을 완성한 것입니다. 그런 다음 간단히 'awk'를 사용하면 필요 없다는 것을 깨달았습니다. 'grep'으로, 그리고 내 대답을 위에서 아래로 다시 썼다. –

관련 문제