2016-12-08 4 views
0

Я определенно могу считать новичком sed/awk. Я работал над многоступенчатым фильтром без успеха. Каждый сегмент дает результаты, когда он работает сам по себе, но когда я их объединяю, я ничего не получаю. Я пробовал sed | awk, awk | sed, sed | sed, awk | awk. Они все терпят неудачу, поэтому я предполагаю, что это хорошо известно всем, кроме меня.трубопровод | awk или awk | sed

Данные представляют собой многострочные блоки текста, где каждый блок можно рассматривать как запись (следовательно, разделитель «>»). После того, как мы фильтруем только блоки 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

Это почти никогда не нужно трубы '' awk' к sed', так как 'awk' может делать большинство вещей, которые' sed' могут сделать , а синтаксис 'awk' обычно легче понять. – Barmar

+0

Позвольте мне дать вам несколько отзывов: как ваш вопрос, так и ваш собственный ответ являются болтливыми до точки отвлечения внимания - пожалуйста, подумайте о том, чтобы сделать их более краткими и целенаправленными. – mklement0

+0

Кроме того, некоторые стандартные рекомендации для новичков: если ответ решает вашу проблему, пожалуйста, примите его, нажав на большой галочкой (✓) рядом с ним и, возможно, также проголосуйте за него (для голосования на голосование требуется не менее 15 точек репутации). Если вы нашли другие ответы полезными, попробуйте их проголосовать. Приём и голосование помогают будущим читателям. См. [Соответствующую статью справочного центра] (http://stackoverflow.com/help/someone-answers). Если ваш вопрос еще не полностью ответил, пожалуйста, сообщите об этом. Если вы считаете, что нашли самое лучшее решение самостоятельно, отправьте его как ответ и само-принимайте. – mklement0

ответ

-1

ОК, так что я в конце концов понял. Я полагаю, что выход 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 

Решение оригинальный вопрос будет:

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

Людей, которые понижают: по крайней мере, дают причину. – Steven2163712

3

Не нужно трубить awk до 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 записи представляет собой многострочный блок текста. После того, как awk фильтрует записи, содержащие ADV_NONCONN, мне нужно отфильтровать только строки в этом блоке записи, которые содержат либо bdaddr, либо RSSI. Ваш фрагмент awk также дает мне пустой набор. –

+0

Я пересмотрел его, чтобы перебрать строки в блоке в 'awk'. – Barmar

+0

Но я признаю, что теперь это не так просто, как ваша первоначальная попытка, и я не уверен, почему это не сработало. – Barmar

Смежные вопросы