Решение Stéphane Chazelas awk
прекрасно:
awk '!/AAA/ || !n++' file.in
Это можно обобщить как
awk '$0 !~ pattern || !n++' pattern="$pattern" file.in
для заданной переменной оболочки $pattern
, содержащей некоторое регулярное выражение.
Если $pattern
содержит обратную косую черту, их необходимо экранировать ( \\
), или вы можете использовать
P="$pattern" awk '$0 !~ ENVIRON["P"] || !n++' file.in
Это работает для меня:
sed 's/.*time=\([0-9]*\) .*/\1/' times | sort -n > outfile
Где раз
этот файл:
cat times
64 bytes from onofri.org (67.222.36.105): icmp_req=1 ttl=47 time=202 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=2 ttl=47 time=206 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=3 ttl=47 time=215 ms
А Outfile
выглядит так:
cat outfile
202
206
215
Вы можете извлечь время с помощью этого примера сценария:
awk -F\= '{print int($4)}' pingoutput.txt
Он использует = в качестве разделителя и функцию int, чтобы получить только числа «202 мс» string
Чтобы перенаправить вывод в другой файл, используйте команду:
awk -F\= '{print int($4)}' pingoutput.txt > times.txt
Для сортировки вывода вы можете направить вывод awk в команду sort
awk -F\= '{print int($4)}' pingoutput.txt |sort -n > times.txt
Утилита sort
может сортировать строки файла без извлечения чисел. Вы делаете это, описывая утилите, какая часть каждой строки составляет ключ сортировки.
sort -t '=' -k 4,4n pingoutput.txt
Опции, используемые с sort
выше, указывают, что ключ сортировки является числовым значением в начале четвертого=
-поля с разделителями.
Если вы хотите получить только числа из результата приведенной выше команды, вы можете использовать sed
, чтобы обрезать все до последнего знака равенства в каждой строке, а затем все после пробела.
sort -t '=' -k 4,4n pingoutput.txt | sed -e 's/.*=//' -e 's/.*//'
Вы также можете выполнять операции в обратном порядке.
sed -e 's/.*=//' -e 's/.*//' pingoutput.txt | sort -n
Используйте перенаправление после любой из приведенных выше команд, чтобы сохранить вывод в файл.