LINUX.ORG.RU

[bash][awk] Произвольное поле как аргумент

 ,


0

2

Здравствуйте.

Существует, к примеру, вот такой лог:

1291361820|1291361755.1269|300|NONE|ABANDON|1|1|61
1291389189|1291389110.1683|300|NONE|ABANDON|1|1|67
1291389298|1291389200.1688|300|NONE|ABANDON|1|1|77
1291389496|1291389304.1693|300|NONE|ABANDON|1|1|172
1291389551|1291389504.1706|300|NONE|ABANDON|1|1|32
1291389690|1291389581.1711|300|NONE|ABANDON|1|1|93
1291390211|1291389853.1717|300|NONE|ABANDON|1|1|343
1291390271|1291390226.1736|300|NONE|ABANDON|1|1|19

Мне надо вывести первое, третье и последнее поле, причём, первое преобразовать из unixtime в повседневное.

Вывод нужной колонки прост:

grep ABANDON queue_log | awk -F '|' '{print $1 $3 $8}'
также просто и преобразовать время:
grep ABANDON queue_log | awk -F '|' '{print $1}' | while read a; do date --date=@"$a"; done
но как объединить первое и второе — не понимаю. В мане awk глядел, но так и не нашёл, как можно исполнить произвольные внешние программы, передавая им в качестве аргумента одно или несколько разных полей и помещая результаты на выход.



Последнее исправление: HolyBoy (всего исправлений: 1)

Но если нужно преобразовать время в читаемый формат, возможно, хватит функции strftime (доступна в gawk, не входит в стандарт).

proud_anon ★★★★★
()

man awk
/strftime

awk -F '|' '/ABANDON/ {print strftime("%T %D", $1), $3, $8}' queue_log

sdio ★★★★★
()

Вообще уже всё ответили, но для порядку: read бывает более чем для одной переменной, поэтому

grep ABANDON queue_log | awk -F '|' '{print $1, $3, $8}' |\
while read t end; do echo "`date --date=@$t` $end"; done
lodin ★★★★
()

можно на sed

$ sed -r 'h;s/^([0-9]+).*$/date --date=@\1/e;G;s/(.*)\n([^|]*\|){2}([^|]*).*\|(.*)/\1|\3|\4/' l.txt 
Птн Дек  3 10:37:00 MSK 2010|300|61
Птн Дек  3 18:13:09 MSK 2010|300|67
Птн Дек  3 18:14:58 MSK 2010|300|77
Птн Дек  3 18:18:16 MSK 2010|300|172
Птн Дек  3 18:19:11 MSK 2010|300|32
Птн Дек  3 18:21:30 MSK 2010|300|93
Птн Дек  3 18:30:11 MSK 2010|300|343
Птн Дек  3 18:31:11 MSK 2010|300|19

drBatty ★★
()
Ответ на: комментарий от proud_anon

Хорошо, погляжу.

Время было выбрано в качестве примера. Проще, наверное, иметь единый шаблон для всех задач и использовать его, заменяя только входные параметры и используемые программы: для одного поля может быть одна, для другого — другая.

Всем спасибо большое за ответы.

HolyBoy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.