2016-12-08 10 views
0

을 나오지 나는 확실히 SED/AWK 초보자 간주 될 수 있습니다. 나는 성공하지 못한 다단계 필터를하기 위해 일해왔다. 각 세그먼트는 자체에서 실행할 때 결과를 산출하지만, 함께 연결하면 아무 것도 얻을 수 없습니다. 나는 sed를 시도했다 | awk, awk | sed, sed | sed, awk | awk. 그들 모두는 실패합니다. 그래서 나는 그것이 모든 사람들에게 잘 알려져 있다고 생각합니다.piping sed | awk 또는 awk |

데이터는 여러 줄의 텍스트 블록으로 각 블록을 레코드로 처리 할 수 ​​있습니다 (따라서 ">"구분 기호). 우리는 단지 ADV_NONCONN 블록에 필터링 후, 나는 다음 "BDADDR"또는 "RSSI"를 포함하는 전용 라인 텍스트의 블록을 필터링하고 싶습니다. 내가 아는 한, 그렇게하기 위해 별도의 작업으로 파이프해야합니다.

sudo hcidump | awk 'BEGIN {RS=">"} /ADV_NONCONN/' | sed -n -e "/bdaddr/p" -e "/RSSI/p" > log.txt 

hcidump 출력 샘플 (한 "기록") : 역 실행

HCI Event: LE Meta Event (0x3e) plen 43 
    LE Advertising Report 
     ADV_NONCONN_IND - Non connectable undirected advertising (3) 
     bdaddr 0C:F3:EE:0D:70:89 (Public) 
     Flags: 0x06 
     Unknown type 0xff with 26 bytes data 
     RSSI: -62 

(먼저 나오지 부를 다음 awk는) 공집합 동일한 결과를 제공한다. 내가 뭘 놓친거야?

+2

그것은 거의 sed''에 awk''파이프 필요 결코 , 'awk' 문법은 보통 이해하기 쉽습니다. – Barmar

+0

내가 당신에게 몇 가지 피드백을 제공 할 수 있도록 허용 : 귀하의 질문에 자신 만의 대답이 모두 혼란의 지점에 수다스러운입니다 - 그들이 더 간결하고 집중하게 고려하시기 바랍니다. – mklement0

+0

새 이민자를위한 몇 가지 표준 조언 : 답변으로 문제가 해결되면 옆에있는 큰 체크 표시 (✓)를 클릭하고 선택 사항으로 최대 투표 (상향 투표에는 평판 포인트 15 점 이상)가 필요합니다. 다른 답변이 도움이 되었으면 최대 투표를하십시오. 수락 및 승격은 미래의 독자에게 도움이됩니다. 관련 도움말 센터 문서 (http://stackoverflow.com/help/someone-answers)를 참조하십시오. 질문에 대한 답변이 아직 충분하지 않은 경우 의견을 보내주십시오. 자신이 가장 좋은 해결책을 찾았다 고 생각하면 대답으로 게시하고 스스로 수락하십시오. – mklement0

답변

-1

확인을, 그래서 나는 결국 그것을 알아 냈 : 그냥 awk 명령에 추가 조건을 추가 할 수 있습니다. 필자는 awk 출력이 어떤 종류의 버퍼링/입력 스트림과 함께하는 닫히기 때문에 파이프 가능하지 않다고 믿습니다. 원래의 질문부터 hcidump에서 타임 스탬프를 추가했습니다.

그래서 먼저 sed를 사용하여 타임 스탬프 앞에 고유 한 문자 (@)를 추가 한 다음 awk에 파이프 처리하여 여러 줄을 레코드 구분 기호로 사용하여 해당 줄을 하나의 레코드로 처리하고 기록은 그때 (현재 레코드의 머리에 타임 스탬프를 포함)가 읽어 필드에서 적절한 출력을 조립 (ADV_NONCONN)를합니다.

sudo hcidump -t | sed -n '/HCI Event/{s/^/@/};p' | awk 'BEGIN {RS="@"} {-F '[\n]'} /ADV_NONCONN/ {print $1 " " $2 ", " $23 ", " $35}' > a.txt 

원래의 질문에 대한 해결책은 다음과 같습니다 awk`이 sed` 할 수있는 '것을 대부분의 일을 할 수있다'이후

sudo hcidump | awk 'BEGIN {RS=">"} {-F '[\n]'} /ADV_NONCONN/ {print $20 ", " $32}' > a.txt 
+0

downvote 사람 : 적어도 이유를 제공합니다. – Steven2163712

3

sed에 파이프 awk 할 필요가 없습니다.

sudo hcidump | awk -v RS=">" '/ADV_NONCONN/ { 
    n = split($0, line, /\n/); 
    for (i = 1; i <= n; i++) { 
     if (line[i] ~ /bdaddr|RSSI/) print line[i]; 
    } 
}' > log.txt 
+0

제가 약간의 세부 사항을 놓친 것 같아요. (원래의 질문에 추가 할 것입니다.) 각 레코드 awk 프로세스는 여러 행의 텍스트 블록입니다. ADV_NONCONN을 포함하는 레코드에 awk 필터를 적용한 후에는 bdaddr 또는 RSSI를 포함하는 해당 레코드 블록의 행만 필터링해야합니다. 너의 awk 미리보기는 나에게 빈 세트를 준다. –

+0

블록의 라인을 'awk'로 반복하도록 수정했습니다. – Barmar

+0

하지만 지금은 이것이 원래 시도만큼 간단하지 않다는 것을 인정합니다. 왜 작동하지 않았는지 모르겠습니다. – Barmar