2015-06-03 2 views
0

Рассмотрим ниже фрагмент кода:Использование AWK и Grep команду в цикл

#! /bin/ksh 
for i in `grep "ProcessOrderWebService-N" Orders.Log | grep "::stringFromNetwork = 600001" | awk -F',' '{print $1}'`; do 
    echo $i; 
done; 

2015-05-26 
10:20:10 
2015-05-26 
10:20:49 
2015-05-26 
10:21:45 

из командной строки, когда я запускаю команду:

grep "ProcessOrderWebService-N" Orders.Log | grep "::stringFromNetwork = 600001" | awk -F',' '{print $1}' 

Выход получил, как показано ниже.

2015-05-26 10:20:10 
2015-05-26 10:20:49 
2015-05-26 10:21:45 

grep шаблон, который я ищу в файле Orders.Log, как показано ниже:

2015-05-26 10:20:10,847 : ProcessOrderWebService-N|220082|1|::stringFromNetwork = 600001 - reference number is 26000033 

В основном я хочу, чтобы получить выход в течение цикла, как 2015-05-26 10:20:10. Где, как в приведенном выше случае, дата и время печатаются в разных строках.

ответ

0

Несколько grep s и awk s в трубах никогда не требуется. В основном работа может быть выполнена с помощью одного инструмента:

grep -oP '^[^,]+(?=.*ProcessOrderWebService-N.*::stringFromNetwork = 600001)' file 

Дает желаемый список. Если вы действительно нуждаетесь в for петлю, ваши должны изменить internal field separator первый:

IFS=$'\n' 
for line in $(grep -oP '^[^,]+(?=.*ProcessOrderWebService-N.*::stringFromNetwork = 600001)' file); do 
    echo $line 
done 

Но я рекомендую while цикл, когда вы имеете дело с линиями:

grep -oP '^[^,]+(?=.*ProcessOrderWebService-N.*::stringFromNetwork = 600001)' file | while read line; do 
    echo $line 
done 
+0

Спасибо за ответ. Я использую оболочку ksh. Есть ли альтернатива опции grep -oP в ksh? – user2531564

+0

@ user2531564 Это работает и в ksh, я тестировал его. Какая у вас версия grep: 'grep --version' – chaos

+0

Я использую solaris UNIX 5.10 Generic_147147-26 sun4u sparc SUNW, SPARC-Enterprise – user2531564

2

Проблема заключается в том, что вы» re с использованием цикла for, который выполняет итерацию (разделение $ IFS) слова не строки. Используйте while read цикл для перебора строк:

#!/bin/ksh 
grep "ProcessOrderWebService-N" Orders.Log | 
grep "::stringFromNetwork = 600001" | 
awk -F',' '{print $1}' | 
while IFS= read -r line; do 
    echo "$line" 
done 

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

awk -F, '/ProcessOrderWebService-N/ && /::stringFromNetwork = 600001/ {print $1}' Orders.Log 
Смежные вопросы