команда для извлечения только чисел из выходных данных

команда для извлечения только чисел из выходных данных

подключаюсь по ssh к удаленному устройству и получаю счетчик потери пакетов.

$ ssh [email protected] cat /proc/net/pf_ring/*eth0* | grep -E "Tot Pkt Lost" 

Вывод команды выше:

Tot Pkt Lost       : 1083761951

Мне нужна команда, которая будет извлекать только потерянные номера Tot Pkt.

решение1

Если у вас есть GNU grep, вы можете сделать:

ssh [email protected] 'cat /proc/net/pf_ring/*eth0*' | 
    grep -oP 'Tot Pkt Lost\s*:\s*\K\d+'
1083761951

Но, awkвозможно, здесь будет и проще, и портативнее:

ssh [email protected] 'cat /proc/net/pf_ring/*eth0*' | 
    awk '/Tot Pkt Lost/{print $NF}'
1083761951

решение2

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

Поэтому вашу команду следует переписать следующим образом:

ssh [email protected] 'cat /proc/net/pf_ring/*eth0*' |
grep -F 'Tot Pkt Lost'

Я использую -Fwith grepздесь, поскольку я сопоставляю строку, а не регулярное выражение. Я также заключаю в кавычки команду, которая должна быть выполнена на удаленном хосте, чтобы шаблон подстановки был расширен там, а не локально.

Это должно дать вам тот же результат:

Tot Pkt Lost       : 1083761951

Чтобы получить только цифры, просто пропустите это через grep -E -o '[[:digit:]]+':

ssh [email protected] 'cat /proc/net/pf_ring/*eth0*' |
grep -F 'Tot Pkt Lost' |
grep -E -o '[[:digit:]]+'

В качестве альтернативы можно использовать sed:

ssh [email protected] 'cat /proc/net/pf_ring/*eth0*' |
sed -n 's/^Tot Pkt Lost.*: //p'

Это сопоставило бы Tot Pkt Lostстроку в начале каждой строки и после нее. Это удалило бы совпавшую строку и напечатало бы остаток строки. Все остальные данные отбрасываются.

Связанный контент