Я пытаюсь разобрать эту строку с vsftpd:

Sun Apr 7 07:23:33 2013 [pid 23590] [cam02430] OK UPLOAD: Client "206.132.183.209", "/20130407/07/20130407_072324D.avi", 496846 bytes, 383.38Kbyte/sec

с:

cut -d" " -f9 | sed 's/\[\(.*\)\]/\1/'

Это успешно анализирует имя пользователя: cam02430

Но теперь дата изменилась:

Wed Apr 10 10:37:50 2013 [pid 26137] [cam02299] OK UPLOAD: Client "206.132.183.201", "/20130410/10/20130410_103802D.avi", 496838 bytes, 363.67Kbyte/sec

Теперь, чтобы разобрать это, я должен использовать:

cut -d" " -f8 | sed 's/\[\(.*\)\]/\1/'

Есть ли лучший способ разобрать имя пользователя в одной строке? Я хотел бы придерживаться сценария оболочки.

1 ответ1

1

Мой первый инстинкт - изолировать пользовательскую часть (используя grep -o). Хорошая вещь об этом - то, что у этого есть (относительно) уникальная маркировка - скобки.

Таким образом, grep ниже изолирует (два) поля, которые заключены в квадратные скобки, затем вынимает первое поле (идентификатор процесса), затем снимает скобку с того, что осталось (пользовательское поле)

 < vsftp.log grep -o '\[[^]]*\] *\[[^]]*\]' | sed -e 's/\[[^]]*\] *//' -e 's/\[\(.*\)\]/\1/'

Если вы можете гарантировать, что в имени пользователя нет пробелов, вы можете воспользоваться этим и немного упростить ситуацию. Найдите поле в скобках без пробелов (поле pid будет иметь их), а затем выполните обрезку.

< vsftp.log grep -o '\[[^] ]*\]' | sed -e 's/\[\(.*\)\]/\1/'

Это работает, хотя не может быть оптимальным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .