подключаюсь по 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
В этом случае нет необходимости использовать -E
with grep
, поскольку вы не используете расширенное регулярное выражение. Вы также расширяете шаблон подстановки на локальной машине, а не на удаленной системе, что может привести к неправильным результатам.
Поэтому вашу команду следует переписать следующим образом:
ssh [email protected] 'cat /proc/net/pf_ring/*eth0*' |
grep -F 'Tot Pkt Lost'
Я использую -F
with 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
строку в начале каждой строки и после :
нее. Это удалило бы совпавшую строку и напечатало бы остаток строки. Все остальные данные отбрасываются.