Когда вы
ls -ld */
вы получаете список (-l) ваших каталогов (-d) в текущем пути. Вы можете увидеть права доступа владельца, группы и других.
Для получения дополнительной информации о правах доступа проверьте:
Эта ссылка
При проверке вывода команды ls вы можете увидеть владельца файла или каталог, а рядом с ним - группа-владелец файла или каталога. Если, например, группа называется « logistics », вы можете просмотреть членов этой группы с помощью следующей команды:
grep 'logistics' /etc/group
Однострочник на 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
вместо:
Если вы предпочитаете делать это в 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
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
Опции Perl:
-l
делает ORS = RS = \n
-a
сохраняет поля в массив @F
, полученный путем разделения текущей записи на /\s+/
, например, $F[0] => $1, $F[1] => $2, ..., $F[-1] => $NF
-n
устанавливает неявный цикл, который считывает входной файл построчно и не выводит, если его не запрашивают.
Блок BEGIN:
Сначала мы печатаем заголовок. Затем мы определяем формат динамически на основе заголовка. Для каждой прочитанной строки мы устанавливаем хэш %h, ключами которого являются строки до =, а значениями — строки после =. Строка, на которую нужно смотреть, примыкает к ? или & слева и & справа. Затем мы настраиваем другой хэш %H, чьи ключи переименованы в версии хэша %h. Затем мы печатаем хеш на основе формата, который мы вычислили в блоке BEGIN.