2015-12-09 2 views
-1

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

egrep -e 'code\ [0-9]{2}' $error_file 

Это код, который работал раньше. Однако некоторые коды ошибок, по-видимому, в журналах, теперь привязаны к строке, поэтому я вынужден распечатать эти символы.

Вот копия сценария:

#!/bin/sh 

echo "Please enter input file name." 
read input_variable 
echo "You entered: $input_variable" 

echo "Please enter a name of the new error file." 
read error_file 
touch $error_file 
echo "The error file name is going to be $error_file" 

echo "Processing printing only the error codes of ${input_variable} to ${error_file}." 

egrep -e '\(code\ [0-9]{1,}\)' $input_variable | tee $input_variable.1 ; 
awk '{print $12$13$14$15}' $input_variable.1 | tee $error_file ; 

echo "Error Codes List: " ; 

egrep -e 'code[0-9]{2}' $error_file | sort -u ; 

echo "Common Errors - Count: " 

echo "Code 2: " ; egrep -c 'code\ 2\)' $input_variable ; 
echo "Code 10: " ; egrep -c 'code\ 10' $input_variable ; 
echo "Code 11: " ; egrep -c 'code\ 11' $input_variable ; 
echo "code 12: " ; egrep -c 'code\ 12' $input_variable ; 
echo "Code 14: " ; egrep -c 'code\ 14' $input_variable ; 
echo "Code 20: " ; egrep -c 'code\ 20' $input_variable ; 
echo "Code 23: " ; egrep -c 'code\ 23' $input_variable ; 
echo "Code 30: " ; egrep -c 'code\ 30' $input_variable ; 
echo "Code 35: " ; egrep -c 'code\ 35' $input_variable ; 
echo "Total Files Transferred: " ; egrep -c '^\[[0-9]{4}/[0-9]{2}/[0-9]{2}\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}\]' $input_variable ; 
echo "Count Complete." 
echo " " ; 
echo "The following are details for each error:" ; 
egrep -e 'code\ [0-9]{1,}' $input_variable ; 
echo "Done. Thank you for using this error report" ; 
rm $input_variable.1 

Вот пример журнала:

[2015/12/09 06:52:10] [12.123.456.789] [[email protected]] [R] idevs error: error in idevs protocol data stream (code 12) at io.c(1179) [sender=1.0.19] 

[2015/12/09 03:01:05] [12.123.456.789] [[email protected]] [R] idevs error: timeout in data send/receive (code 30) at io.c(168) [sender=1.0.19] 

Мой выходной ток:

Error Codes List: 
(code30)atio.c(168) 
datastream(code12) 
Common Errors - Count: 
Code 2: 
0 
Code 10: 
0 
Code 11: 
0 
code 12: 
63 
Code 14: 
0 
Code 20: 
0 
Code 23: 
0 
Code 30: 
11 
Code 35: 
0 
Total Files Transferred: 
263 
Count Complete. 

The following are details for each error: 
//prints each line with code\ [0-9]{1,} in the line// 

Пожалуйста, помогите мне напечатать Ошибка Список кодов без дополнительных символов, так что это просто:

code12 
code30 

Спасибо!

ответ

0

Вы, вероятно, хотите:

egrep -o 'code\ [0-9]{1,}' $input_variable | sort -u 

Это вариант -o Grep, что ключ здесь.


Чтобы найти итоги, я бы переписать код так, что вы только работает Grep раз против этого файла:

count=() 
total=0 

while read code num; do 
    ((count[$num]++, total++)) 
done < <(egrep -o 'code\ [0-9]+' $input_variable) 

for num in 2 10 11 12 14 20 23 30 35; do 
    echo "Code $num: ${count[$num]}" 
done 
echo "Total: $total" 
+0

Большое спасибо !!! Это сработало. – technerdius

+0

Что-то классное Я бы хотел добавить к этому, чтобы добавить общее количество ошибок. Я не вижу способа сделать это, по крайней мере, с тем, как я написал сценарий. Можете ли вы мне помочь? – technerdius

+0

Я думаю, что это отличная идея. Я ввел ваш код вместо моего общего раздела. Однако я получил './errors/script: строка 32: синтаксическая ошибка около неожиданного токена' <' ./errors/backerr1: строка 32: 'done <<(egrep -o' code \ [0-9] + ' $ input_variable) «У вас есть предложения? – technerdius

Смежные вопросы