Возможно, у вас проблема с буферизацией строк. Прикажите tcpdump
и промежуточной grep
команде(ам) буферизировать свои выходы следующим образом:
sudo tcpdump -l | grep --line-buffered -E '.dev:8888|ads' | grep -v 'adsl'
Смотрите также Отключить буферизацию в pipe для общих решений, когда эти опции команд недоступны.
Предположим, что каждая строка вашего ввода (или по крайней мере каждая строка, начинающаяся с «К» )ровно 29 символов, Я смог продублировать желаемый результат с помощью
rev filename | paste filename - | awk ' { if (substr($0,1,1) == "K") { print substr($0,1,5) substr($0,39,17) substr($0,24,7) } }'
Это
rev
весь входной файл сразу. rev
производит ровно одну строку вывода для каждой строки ввода. Мое решение зависит от такого поведения в вашей внешней программе. paste
)входного файла с выходным файлом rev
, строка за строкой. Для ваших образцов данных это выглядит такK1353 SF3987.7PD833391.4 KARE ERAK 4.193338DP7.7893FS 3531K K1353 SF3987.2KD832231.4 MEAKE EKAEM 4.132238DK2.7893FS 3531K K1332 IF4987.7RP832231.2 LEAOS SOAEL 2.132238PR7.7894FI 2331K K1329 SF2787.7KD362619.3 NEDLE ELDEN 3.916263DK7.7872FS 9231K K1353 SK3K84.3KD832231.3 PQAKM MKAQP 3.132238DK3.48K3KS 3531K
awk
читает приведенные выше строки. Каждый содержит одну строку из входного файла объединяется с выводом rev
для этой строки. awk
затем объединяет желаемые части каждого. <разглагольствование>
Ваш вопрос немного бессвязен. Если я возьму ваш образец входных данных,
K1353 SF3987.7PD833391.4 KARE
K1353 SF3987.2KD832231.4 MEAKE
K1332 IF4987.7RP832231.2 LEAOS
K1329 SF2787.7KD362619.3 NEDLE
K1353 SK3K84.3KD832231.3 PQAKM
и передать его этому awk
скрипту:
{
RX=substr($0,6,9)
RY=substr($0,15,9)
printf("/%s/%s/\n", RX, RY)
}
Я получаю этот вывод:
/ SF3987.7/PD833391./
/ SF3987.2/KD832231./
/ IF4987.7/RP832231./
/ SF2787.7/KD362619./
/ SK3K84.3/KD832231./
Обратите внимание, что значение RX
включает пространство между первой и второй колонками, а значение RY
не включает непоследний символ значения во втором столбце (т. е. цифра после второй точки ). Это действительно не имеет смысла, потому что
sprintf("echo %s %s | %s", RX, RY, csmok)
Оператор приводит к потере начального пространства в RX
.
Как ни странно,этосоответствуетожидаемым результатам внизу вашего вопроса, но не с пятью абзацами выше, где вы говорите о выполнении
echo -e "SF3987.7 PD833391.4\nSF3987.2 KD832231.4\nIF4987.7 RP832231.2" | rev
т. е. вы включаете цифру после второй точки в строке, которую вы отправляете на rev
.
И , вы извлекаете две не -перекрывающиеся (, но смежные )подстроки из $0
, а затем вы отделяете output
от команды rev
, все без надобности. Я могу продублировать ваши результаты с помощью
BEGIN {
csmok="rev"
}
{
type = substr($0,1,1)
if (type == "K") {
RXY=substr($0,6,18)
cmd=sprintf("echo %s | %s", RXY, csmok)
cmd | getline output
close(cmd)
sub(RXY,output)
print
}
}
т. е. извлечение одной 18-символьной подстроки -из $0
и не разбивать строку output
.
Пожалуйста, постарайтесь, чтобы данные в ваших вопросах были осмысленными и внутренне непротиворечивыми.
Тем не менее, вы вроде понимаете, что не всегда нужно публиковать каждую деталь вашей конкретной проблемы, точно, чтобы получить обоснованный ответ. В этом духе, пожалуйста, постарайтесь сделать вашу проблему более понятной. без нарушения его целостности. Мне больно в глаза от твоих данных:
Я бы посоветовал вам опубликовать примеры данных, подобные этому:
ant 12345.hill Adam
bat 31416.cave Bruce
cat 13579.meow Felix
dog 32768.bark Angus
При таких входных данных желаемый результат может содержать строки как «tac», «97531», «woem» и «xileF», и было бы легко для человека, чтобы посмотреть на них и увидеть, откуда они взялись. В отличие от «132238DK2», который требует от человека затрат шести-восьми минут с увеличительным стеклом, чтобы найти источник — почти как одна из тех головоломок «поиск слов». (Обратите внимание, что «132238DK» нельзя однозначно отследить, потому что «KD832231» появляется дважды.)