как объединить команду cut с арифметическим сравнением

#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 решение.