Получить конкретную информацию из лог-файла

Когда вы

ls -ld */

вы получаете список (-l) ваших каталогов (-d) в текущем пути. Вы можете увидеть права доступа владельца, группы и других.
Для получения дополнительной информации о правах доступа проверьте:
Эта ссылка

При проверке вывода команды ls вы можете увидеть владельца файла или каталог, а рядом с ним - группа-владелец файла или каталога. Если, например, группа называется « logistics », вы можете просмотреть членов этой группы с помощью следующей команды:

grep 'logistics' /etc/group

1
26.04.2017, 19:00
3 ответа

Однострочник на perl:

$ perl -lne '
BEGIN{
    printf "%-10s%-10s%-10s%-10s%-15s\n", qw([user] [module] [action] [doAjax] [ajaxAction]);
} 
$usr = $mde = $act = $doAj = $ajAc = "null"; 
$usr=$1 if m|\s/([^/]+)/|; 
$mde=$1 if /m=(.+?)(&|$)/; 
$act=$1 if /a=(.+?)(&|$)/; 
$doAj=$1 if /doajax=(.+?)(&|$)/; 
$ajAc=$1 if /action=(.+?)(&|$)/; 
printf "%-10s%-10s%-10s%-10s%-15s\n", ($usr,$mde,$act,$doAj,$ajAc)' file 
[user]    [module]  [action]  [doAjax]  [ajaxAction]   
userx     contacts  form      null      null           
usery     customer  null      request   getContacts    
userx     meeting   null      date      null           

Основной трюк здесь заключается в поиске каждой из строк, идентифицирующих части вашего URL, и, если она найдена, установке соответствующей переменной. В каждом случае мы ищем идентификатор, за которым следует = (например, m=), а затем либо &, либо конец строки (&|$). Поскольку совпадающая часть помещается в круглую скобку (например, m=(.+?)), мы можем ссылаться на нее как на $2, что и сохраняется в каждой переменной.

Если вам действительно нужно иметь | в качестве разделителя, и вы не возражаете против того, что это сделает вывод менее читаемым, вы можете использовать следующее:

$ perl -lne '
BEGIN{
    printf "%s|%s|%s|%s|%s\n", qw([user] [module] [action] [doAjax] [ajaxAction]);
} 
$usr = $mde = $act = $doAj = $ajAc = "null"; 
$usr=$1 if m|\s/([^/]+)/|; 
$mde=$1 if /m=(.+?)(&|$)/; 
$act=$1 if /a=(.+?)(&|$)/; 
$doAj=$1 if /doajax=(.+?)(&|$)/; 
$ajAc=$1 if /action=(.+?)(&|$)/; 
print join "|", ($usr,$mde,$act,$doAj,$ajAc)' file 
[user]|[module]|[action]|[doAjax]|[ajaxAction]
userx|contacts|form|null|null
usery|customer|null|request|getContacts
userx|meeting|null|date|null

Лучшим (более читаемым выводом) подходом было бы использование printf вместо:

2
27.01.2020, 23:19

Если вы предпочитаете делать это в awk, вы можете сделать следующее. Split позволяет разделить строку любым разделителем полей.

awk  '{split($7,a,"/"); split(a[3],b,"m="); split(b[2],c,"&"); split(c[2],d,"="); print a[2], c[1], d[1], d[2] }' logfile

Это генерирует желаемые столбцы.

userx contacts a form
usery customer doajax request
userx meeting doajax date

Остающийся шаг - отформатировать. Массивы в awk ассоциативны и могут индексироваться строками - см. здесь . Вы можете сделать следующее; здесь op (сокращение от output) инициализируется значением null. Затем мы устанавливаем op [d [1]] = d [2] .

awk  '{split($7,a,"/"); split(a[3],b,"m="); split(b[2],c,"&"); split(c[2],d,"="); op["a"]="null"; op["doajax"]="null"; op["ajaxaction"]="null"; op[d[1]]=d[2];print a[2], c[1], op["a"], op["doajax"], op["ajaxaction"] }' junk.txt 

[изменено на]

awk  '{split($7,a,"/"); split(a[3],b,"m="); split(b[2],c,"&"); split(c[2],d,"="); op["a"]="null"; op["doajax"]="null"; op["action"]="null"; op[d[1]]=d[2]; split(c[3],f,"="); split(f[2],g,"."); op[f[1]]=g[1]; print a[2], c[1], op["a"], op["doajax"], op["action"] }' junk.txt 

Вывод выглядит следующим образом

userx contacts form null null
usery customer null request getContacts
userx meeting null date null
2
27.01.2020, 23:19
perl -lane '
BEGIN {
   print $H = join "|", map { s/.*/[$&]/r } @H = qw/user module action doAjax ajaxAction/;
   pos($H) = 0;
   push(@pos, pos($H)-$p), $p=pos($H) while $H =~ /\[/g;
   $fmt = join "", map { "\%-${_}s" } @pos[1..$#pos], length($H)-$p;
}

   my(%h, %H) = $F[-1] =~ /[?&]\K([^=]+)=([^&]+)/g;
   @H{@H} = ($F[-1] =~ m|^/([^/]+)|, @h{qw/m a doajax action/});
   print sprintf $fmt, map { $H{$_} // "null" } @H;
' logfile

Результаты

[user]|[module]|[action]|[doAjax]|[ajaxAction]
userx  contacts form     null     null
usery  customer null     request  getContacts
userx  meeting  null     date     null

Объяснение

  1. Опции Perl:

    -l делает ORS = RS = \n

    -a сохраняет поля в массив @F, полученный путем разделения текущей записи на /\s+/, например, $F[0] => $1, $F[1] => $2, ..., $F[-1] => $NF

    -n устанавливает неявный цикл, который считывает входной файл построчно и не выводит, если его не запрашивают.

  2. Блок BEGIN:

    Сначала мы печатаем заголовок. Затем мы определяем формат динамически на основе заголовка. Для каждой прочитанной строки мы устанавливаем хэш %h, ключами которого являются строки до =, а значениями — строки после =. Строка, на которую нужно смотреть, примыкает к ? или & слева и & справа. Затем мы настраиваем другой хэш %H, чьи ключи переименованы в версии хэша %h. Затем мы печатаем хеш на основе формата, который мы вычислили в блоке BEGIN.

0
27.01.2020, 23:19

Теги

Похожие вопросы