#shell #awk #cut
#оболочка #awk #вырезать
Вопрос:
Всем доброго утра,
У меня есть файл под названием test.txt
audit.log.20140612:6/11/14 6:27:33 AM;SUCCESS;998ms;10.62.172.52;52750;Issue
audit.log.20140612:6/11/14 6:28:25 AM;SUCCESS;580ms;10.62.172.52;52750;Issue;
audit.log.20140612:6/11/14 6:28:25 AM;SUCCESS;500ms;10.62.172.52;52750;Issue;
audit.log.20140612:6/11/14 6:28:25 AM;SUCCESS;58ms;10.62.172.52;52750;Issue;
Теперь я хотел извлечь все строки, которые имеют более 100 мс (миллисекунд).
Я добился получения формы 3-го поля следующей команды,
cut -d ';' -f 3 test.txt
Теперь я хочу передать эти результаты в какую-нибудь команду оболочки, чтобы я мог сравнить результаты. где time is > 100ms
Наконец, мой вывод должен быть,
audit.log.20140612:6/11/14 6:27:33 AM;SUCCESS;998ms;10.62.172.52;52750;Issue
audit.log.20140612:6/11/14 6:28:25 AM;SUCCESS;580ms;10.62.172.52;52750;Issue;
audit.log.20140612:6/11/14 6:28:25 AM;SUCCESS;500ms;10.62.172.52;52750;Issue;
Комментарии:
1. невозможно в оболочке?
Ответ №1:
С awk
:
awk -F';' '$3 0 > 100' yourfile
С bash
:
#!/bin/bash
while read line; do
fields=(${line//;/ });
t=${fields[4]};
if [ ${t%ms} -gt 100 ];
then
echo "$line";
fi;
done< yourfile
Комментарии:
1. При сравнении она преобразует
58ms
в58
. После этого вы можете выполнить арифметическое сравнение.2. Намного элегантнее и компактнее, чем то, что я придумал: awk -F’;’ ‘{time=substr($ 3, соответствует($3,/[0-9] /), RLENGTH); if(int (time) > 100){ вывести 0 долларов; } }’ test.txt
3.
0
часто встречается вawk
командах для извлечения чисел из поля. Но это не сработает, если текст находится перед числами типаmore76
. Вы можете использоватьsub(/[[:alpha:]]*/,"",$1
, чтобы избавиться от текста.4. @run, также обновил
bash
решение.