awk и cat - Как игнорировать несколько строк? - PullRequest
1 голос
/ 10 января 2011

Мне нужно извлечь журнал Voip из маршрутизатора D-Link, поэтому я установил небольшой скрипт на python, который выполняет команду на этом маршрутизаторе через telnet.Мой сценарий выполняет команду "cat /var/log/calls.log" и возвращает результат, однако ... он также отправляет несущественные элементы, такие как баннер BusyBox и т. Д. Как я могу игнорировать строки от 1 до 6а последние 2?Это мой текущий вывод:

yaba@foobar:/stuff$ python calls.py


BusyBox v1.00 (2009.04.09-11:17+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.

DVA-G3170i/PT # cat /var/call.log
1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1
DVA-G3170i/PT # exit

И мне просто нужно:

1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1

(он может иметь несколько строк), чтобы я мог сохранить его в CSV, а затем в SQLdb.

Спасибо, извините, мой плохой английский.

Ответы [ 5 ]

3 голосов
/ 10 января 2011

Почему бы не использовать шаблон в AWK для соответствия желаемому тексту?

python calls.py | awk '/^[0-9]/{print}/'

Целое POINT в AWK соответствует линиям на основе шаблонов и манипулирует / печатает эти совпадающие линии.


Отредактировано для добавления примера выполнения.

Вот файл ненужных данных, основанный на вашем примере выше.

$ cat junk.dat


BusyBox v1.00 (2009.04.09-11:17+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.

DVA-G3170i/PT # cat /var/call.log
1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1
DVA-G3170i/PT # exit

Здесь он проходит через AWK с фильтром.

$ cat junk.dat | awk '/^[0-9]/ {print}'
1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1

Нет необходимости в SED, не нужно считать строки, не нужно ничего, кроме AWK. Зачем делать вещи сложнее, чем нужно?

1 голос
/ 10 января 2011

За один звонок sed:

sed -n '1,6d;7,${N;$q;P;D}'

или для требовательных версий sed:

sed -ne '1,6d' -e '7,${N' -e '$q' -e 'P' -e 'D}'

Вы также можете сделать это на основе совпадений:

sed -n '/^[0-9]+/p'

или что-то подобное.

Но почему ваш скрипт Python не читает файл и не выполняет фильтрацию (вместо вызова внешней утилиты)?

0 голосов
/ 15 марта 2012

Это может работать для вас:

sed '1,6d;$!N;$d;P;D' file
0 голосов
/ 10 января 2011

Я не уверен, что это лучший способ сделать это (возможно, маршрутизатор D-Link поддерживает FTP или SSH), но вы можете сделать это с помощью awk:

awk '/cat/, /exit/' | sed -e '1d' -e '$d'

awk будет печатать все междустроки, содержащие "cat" и "exit", к сожалению, включая эти две строки.Вот для чего остальные команды, я не мог понять, как сделать это лучше, чем это ...

0 голосов
/ 10 января 2011

python Call.Py | sed -e 1,6d -e '$ d'


Так что это может сработать. Он отфильтрует первые 6 и последние, что показывает ваш пример. Если вы действительно хотите заглушить последние две строки, вы можете сделать:

python calls.py | sed -e 1,6d -e '$d' | sed -e '$d'

Но подожди ... ты сказал awk, так что ...

python calls.py | awk '{ if(NR > 7) { print t }; t = $0 }'
...