2016-04-12 3 views
0

Как вырезать определенное поле из строки?Конкретные поля с использованием разреза или Awk

Проблема в том, что я не могу использовать cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14, так как поле меняется.

Скажем, у меня есть файл с именем/вар/Журнал/тест, и одна из линий внутри файла выглядит следующим образом:

Apr 12 07:48:11 172.89.92.41 %ASA-5-713120: Group = People, Username = james.robert, IP = 219.89.259.32, PHASE 2 COMPLETED (msgid=9a4ce822) 

Мне нужно только, чтобы получить имя пользователя и времени/даты (пожалуйста, записные колонны постоянно меняются, поэтому мне нужно, чтобы соответствовать Имя пользователя = james.robert АПР 12 07:48:11

Когда я использую:.

grep "james" /var/log/tes | cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14 

не работает для меня Так что есть соответствовать e и печатает только имя пользователя и данные/время. Какие-либо предложения?

ИТАК, когда я использую это:

awk -F'[ ,]' '$12~/username/{print $1,$2,$3,$12}' /var/log/test 

, но это работает для некоторых пользователей, но не другие, потому что поля двигаться.

Пример вывод этой команды:

12 апреля 6:00:39 james.robert

Но когда я пытаюсь этой командой этого имени пользователя, он не работает. Смотрите ниже:

вот еще один пример того, что с помощью данной команды ничего не показывает:

Apr 8 12:16:13 172.24.32.1 %ASA-6-713228: Group = people, Username = marry.tarin, IP = 209.157.190.11, Assigned private IP address 192.168.237.38 to remote user 
+0

Является ли первое поле всегда датой? –

+0

да есть. но имя пользователя продолжает двигаться. –

+2

Если вы могли бы разместить более одной записи в качестве примера. Вас спросили несколько человек. Мы стреляем в темноту и не можем догадаться о ваших крайних случаях. – JNevill

ответ

1

если ваш файл структурирован последовательно

awk -F'[ ,]' '{print $1,$2,$3,$12}' file 

Apr 12 07:48:11 james.robert 

, если вам нужно, чтобы соответствовать имени пользователя, используя ввод образца

$ awk -F'[ ,]' '$12~/james/{print $1,$2,$3,$12}' file 
Apr 12 07:48:11 james.robert 

UPDATE

ОК, ваши пространства не соответствуют, чтобы исправить менять -F

$ awk -F' +|,' '{print $1,$2,$3,$12}' file 

Apr 12 07:48:11 james.robert 
Apr 8 12:16:13 marry.tarin 

вы можете добавить/pattern /, чтобы ограничить соответствие пользователям, как указано выше. Обратите внимание на изменение параметра -F.

-F' +|,' устанавливает разделитель полей в пространства (одного или несколько) или запятая, остальное считая поля и собирание правильной для печати. /pattern/ будет фильтровать строки, соответствующие шаблону регулярного выражения, который может быть ограничен только определенным полем (например,12) по $12~/pattern/

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

$ awk -F' +|,' 'tolower($12)~/patterninlowercase/{print $1,$2,$3,$12}' file 
+0

Это дает мне разные результаты. А также, где это соответствует имени пользователя? –

+0

, пожалуйста, напишите, что вы ожидаете увидеть и что у вас есть. – karakfa

+0

Хорошо, это работает намного лучше, но есть еще некоторые проблемы. Вот что, невозможно получить дату, имя пользователя и дату по-другому? потому что он работает для 2, 3 пользователей, но когда я набираю четвертого пользователя с другим именем, он ничего не показывает. Есть ли другой механизм? –

0

Вы можете использовать awk разграничить запятой, а затем использовать substr() и length(), чтобы получить на куски, вы заботитесь о:

awk -F"," '{print substr($1,1,15), substring($3, 13, length($3)-12)}' /var/log/test 
+0

это дает мне ошибку. И где это даже пытается совместить имя пользователя? –

+0

Это не так. Предполагается, что размещение запятых согласовано, чтобы поле 'username =' находилось в третьей позиции. – JNevill

+2

Возможно ... было бы полезно, если бы вы включили более одного файла из своего файла журнала, чтобы мы могли иметь представление о различных форматах, в которых могут содержаться эти записи. Лучшее, что мы можем сделать, - это такой же широкий диапазон, как и мы можно догадаться, и надеяться, что он поймает все ваши дела. Не видя по-разному отформатированные записи, сложно это угадать. – JNevill

1

С sed:

sed -r 's/^([A-Za-z]{3} [0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*(Username = [^,]*).*/\1 \2/g' file 
+0

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

+0

@RomiKajaki, '(Username = [^,] *)' будет совпадать с именем пользователя и данные будут сгруппированы. Вы можете отправить эту группу позже в подстановку, используя '\ 2' (2-я группа). – sat

0

С gawk

awk '{u=gensub(/.*(Username = [^,]*).*/,"\\1","g",$0);if (u ~ "james") {print u,$1,$2,$3}}' file 
+0

Не работает. Он показывает все! Мне нужно только имя пользователя и дата. Нравится: Apr 12 07:48:11 james.robert –

0

Следующий perl напечатает дату и имя пользователя, помеченные вкладкой. Добавьте дополнительные допустимые символы имени пользователя в [\w.]:

perl -ne ' 
    print $+{date}, "\t", $+{user}, "\n" if 
     /^(?<date>([^\s]+\s+){2}[^\s]+).*\bUsername\s*=\s*(?<user>[\w.]+)/ 
    ' 

Различных количества вкладки и пробела.

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