2013-11-18 19 views
2

У меня есть скрипт, который выводит среднее время, когда пинговать сервера, как показано ниже:печать номер строки вывода в сценарии оболочки

ping -c3 "${I}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | sed 's/$/\tms/' 

Как я могу добавить номер строки для вывода сценария выше, когда pinging список серверов ??

моего фактического выхода, когда пинг список 3 ополчения:

6.924 ms 
100.099 ms 
7.756 ms 

Я хочу выхода быть похожим на это:

1,6.924 ms 
2,100.099 ms 
3,7,756 ms 

так, что это может быть прочитано первенствуют :) благодарственного в продвинутых!!

+0

Эти команды в цикле? – jkshah

+0

точно :) В цикле for :) –

+0

Я смущен вашим выходом. «Sed» в вашем примере выглядит так, что он помещает вкладку перед «ms». Вам нужна вкладка или пробел? –

ответ

2

Pipe ваш выход через Perl:

echo -e 'aa\nbb' | perl -ne 'print $., ",", $_' 

Выход:

1,aa 
2,bb 
+0

+1 или awk: '| awk '{print NR "," $ 0}' '. Вы также можете написать 'perl -pe 's /^/$.,/'' –

+0

@glennjackman You golfed me =) –

+2

OP циклически перебирает команду, а ее выход - только одна строка для каждой итерации. Следовательно, я думаю, что этот подход недействителен для этого случая. – jkshah

2

Это то, что вы хотите?

C=1 
for I in 'host1' 'host2' 'host3' 
do 
    ping -c3 "${I}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | echo "$C,$(sed 's/$/\tms/')" 
    C=$((C+1)) 
done 
+0

+1. Неплохо. Или 'sed -r 's /(.*)/'$ C', \ 1 \ tms/''? – jkshah

0

Стандартный инструмент для нумерации строк является nl. Pipe ваш выход в nl -s, То есть:

for I; do 
    ping -c3 "${I}" | awk -F/ 'END{print $5, "\tms"}' 
done | nl -s, 

Поскольку вы не указали, как формируется список, я просто показывает случай, когда список хостов пингуется задается в командной строке. Обратите внимание, что это вводит ведущие пробелы перед номером строки, поэтому вы можете отфильтровать это с помощью sed для удаления.

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

line=1 
{ for I; do ping -c3 $I | awk -F/ 'END{ 
    printf("%d,%s\tms\n", line,$5)}' line=$line & 
    : $((line +=1)) 
done; wait; } | sort -n 

В этом случае wait не является необходимым, так как sort не будет блокировать, пока все pings закрыли свой вывод, но wait становится необходимым, если вы добавляете какие-либо процессы в конвейере до sort, которые не обязательно дожидаются их ввода до выполнения любой обработки, поэтому рекомендуется оставить wait на месте.

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