Как извлечь положительные числа в первом столбце от вывода как в вопросе?

Это зависит от Вашей конфигурации таблицы маршрутизации, не интерфейсов NIC.

Таким образом для обнаружения, какой интерфейс это использует необходимо знать который использование ядра шлюза направить пакеты, например,

%> ip route get 192.168.56.99
   192.168.56.20 dev vboxnet0  src 192.168.56.1 
       cache

Fom вывод, который можно сказать используемому интерфейсу, vboxnet0

2
20.02.2015, 01:41
2 ответа

Используя sed

Это позволит вывести только те строки, которые начинаются с положительного числа:

sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'

В сочетании с одной из ваших линий, это будет выглядеть как:

h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'

Как это работает

  • -n

    Это говорит sed не печатать ни одну линию, если только мы явно не попросим об этом.

  • s/^\([[:digit:]][^ ,]*\).*/\1/p

    Это говорит sed искать строки, начинающиеся с положительного числа и выводить только это число.

    В регексе ^ совпадает только с началом строки. [[:цифра:]] совпадает с любой цифрой. [^ ,]* совпадает со всем, что следует за этой цифрой, кроме пробела или запятой. Все это сгруппировано в круглые скобки, так что позже мы сможем сослаться на число как \1. Затем вся строка заменяется номером, и с помощью опции p мы говорим sed распечатать его.

    Одна из них использовала [0-9] для совпадения цифр. С появлением юникодных шрифтов это больше не является надежным. Выражение [[:digit:]], однако, является юникодовым безопасным.

Альтернатива использованию расширенного regex

Если вы используете GNU sed (что верно для всех Linux-систем), то опция -r может быть использована для получения расширенных регулярных выражений. При использовании расширенного регекса, пары, используемые для группировки, не нужно экранировать:

sed -rn 's/^([[:digit:]][^ ,]*).*/\1/p'

На OSX или других системах BSD используйте -E вместо -r.

Использование awk

Это делает то же самое, но с использованием awk:

awk -F, '/^[[:digit:]]/{print $1}'

В сочетании с вашим конвейером:

h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | awk -F, '/^[[:digit:]]/{print $1}'
2
27.01.2020, 22:05

Учитывая ввод, вы показываете, следующее должно работать:

sed -n 's/[^[:digit:]]/\
&/;/.\n/P'

... или ...

sed 's/[^[:digit:]].*//;/./!d'

... с некоторыми SED Напишите это как ...

sed -n 's/[^0-9]/\n&/;/.\n/P'

... или ...

sed 's/[^0-9].*//;/./!d'

... и, может быть, даже - в зависимости от вашего входного набора данных - с GNU SED , как ...

sed -n 's/\W/\n&/;/.\n/P'

... или ...

sed 's/\W.*//;/./!d'

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

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

Первый пример выше вставляет \ N \ N символ EWLINE перед первым нечисленным символом, который он встречается на линии. Затем он проверяет, сделав так (если это сделало так) , существует по меньшей мере один символ между вставкой и головкой линии. Если нет, он не печатает, но если так, он печатает только до \ N EWLINE.

Следующий пример похож - он просто понижает самую длинную строку, которую она может из линии, которая начинается с символа, который не соответствует вашему шаблону, затем удаляет все пустые строки от вывода.

Остальные - это просто сокращены для того, чтобы делать больше того же, что и некоторые SED , могут интерпретировать их, хотя первые два придерживаются довольно строго для POSIX SED Спецификация синтаксиса ( хотя это может быть [[: цифры:]] является излишеством, потому что, как я понимаю, UTF-8 является ASCII надстройкой и большинство языков, которые не включают в себя арабские цифры также отличаются достаточно от одного в Что я пишу это, чтобы потребовать других модификаций, чтобы сделать это работоспособным в любом случае) .

Все примеры - в зависимости от внедрения и ввода, как отмечено, - следует печатать только первую последовательную последовательность цифр, которые начинаются в головке линии.

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

sed -n 'y/, -/\n\n\n/;/^[0-9]/P'

... который вряд ли делает какую-либо фактическую регулярное выражение - как Y /// Функция Переводится символов, а не группируя их на шаблонах. Соответствующий Regexp вызывается только для проверки результата.

1
27.01.2020, 22:05

Теги

Похожие вопросы