2014-09-17 2 views
2

Я пытаюсь найти способ добавления пути к каждой строке печатного текста из файла. Так, например, если у меня есть файл журнала почты (позволяет называть его /var/log/mail.log), когда я показываю файл я получаю строки в стандартный вывод, такие как:Добавление пути к каждой строке строки текста

Jun 27 03:28:39 host courier-pop3d: LOGIN, [email protected], ip=[::ffff:1.1.1.1], port=[2796] 
    Jun 27 03:28:46 host courier-imaps: Connection, ip=[::ffff:1.1.1.1] 
    Jun 27 03:28:46 host courier-imaps: LOGIN FAILED, method=CRAM-MD5, ip=[::ffff:1.1.1.1] 
    Jun 27 03:28:52 host courier-imaps: LOGIN FAILED, [email protected], ip=[::ffff:1.1.1.1] 
    Jun 27 03:28:52 host courier-imaps: authentication error: Input/output error 
    Jun 27 03:28:55 host courier-pop3d: Connection, ip=[::ffff:1.1.1.1] 
    Jun 27 03:28:55 host courier-pop3d: LOGOUT, ip=[::ffff:1.1.1.1] 

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

Jun 27 03:28:39 host courier-pop3d: LOGIN, [email protected], ip=[::ffff:1.1.1.1], port=[2796] /var/log/mail.log 
    Jun 27 03:28:46 host courier-imaps: Connection, ip=[::ffff:1.1.1.1] /var/log/mail.log 
    Jun 27 03:28:46 host courier-imaps: LOGIN FAILED, method=CRAM-MD5, ip=[::ffff:1.1.1.1] /var/log/mail.log 
    Jun 27 03:28:52 host courier-imaps: LOGIN FAILED, [email protected], ip=[::ffff:1.1.1.1] /var/log/mail.log 
    Jun 27 03:28:52 host courier-imaps: authentication error: Input/output error /var/log/mail.log 
    Jun 27 03:28:55 host courier-pop3d: Connection, ip=[::ffff:1.1.1.1] /var/log/mail.log 
    Jun 27 03:28:55 host courier-pop3d: LOGOUT, ip=[::ffff:1.1.1.1] /var/log/mail.log 

Я ищу стандартную команду BASH (ы) для делать это, так как это должно работать на сотнях различных серверов без установки аддитивных программ.

+0

Если вы не заботитесь о точном формате, эта простая команда будет работать: 'Grep -Н«»mail.log' –

ответ

0

Если вы не возражаете, добавив эту информацию в самом начале, а не в конце: -H переключатель grep «s позволяет предваряя каждую согласованную линию с соответствующим именем файла, указанным на линии commmand, а также с двоеточием. В этом случае мы просим grep, чтобы соответствовать любой строке:

grep -H "" /var/log/mail.log 

Производительность в моем тесте было около 100 мс для 15.000 строк журнала.

+0

Это ставит имя файла на ** начало ** каждой строки вместо ** end **, а затем пытается «grep .../var/log/mail.log» (не ответ, вам может потребоваться внести поправки) –

+0

@ DavidC.Rankin Да, это именно то, что я написал. ОП не уточнил, интересуется ли он или нет положение информации внутри линии. Преимуществом этого решения является его простота. Однако он не будет иметь лучшую производительность. Но почему вы думаете, что это не ответ? –

+0

На самом деле после тестирования всех вышеперечисленных ответов это работало лучше всего, даже если он поместил путь файла в начале. – lostinthewoods

2

В общем, чтобы добавить любую строку в конец каждой строки, вы можете использовать sed.

sed 's/$/ INSERT_STRING_HERE/' InputFileName 

Для вашей конкретной проблемы, если вы пытаетесь перебрать кучу файлов, что имя файла должно быть доступно в качестве переменной.

1

Следующий сценарий AWK добавит имя файла для каждой строки:

awk '{ print $0, ARGV[1] }' file 
0

Еще один один:

awk '{print $0" "FILENAME;}' /path/to/some/file 
Смежные вопросы