Использование cut с восклицательным знаком в качестве разделителя

Для MX Linux это:

sudo apt-get install linux-cpupower

Также в MX linux вы можете открыть установщик пакетов MX и выполнить поиск «cpupower» в полном каталоге приложений

Для Зорин 15.2 его:

sudo apt-get install -y linux-tools-common linux-tools-$(uname -r)

Вы также можете перейти на Synaptic и выполнить поиск -linux tools -common. Вы также можете искать linux -tools -и вывод uname -r. бывший. linux -инструменты -5.3.0 -42 -универсальный

3
16.03.2021, 10:02
4 ответа

Если эти строки находятся в ФАЙЛЕ, и вам всегда нужны только первые числа после !и до первого ,, если они существуют, это должно работать

awk -F'[!,]' '{print$2}' FILE

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

Если есть ,перед первым !, верхний пример awk неприменим.

Вы также можете направить одну команду cutв другую, в первой вы указываете !в качестве разделителя и берете материал после первого !, а во втором вы указываете ,в качестве разделителя и берете материал перед первым ,если он существует

cut -d'!' -f2 FILE | cut -d',' -f1
10
18.03.2021, 22:24

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

.
$ echo 'string/more!99,string/more!98,string/more!97' | 
    cut -d'!' -f2- | cut -d, -f1
99

Точно так же для случая, когда у вас нет ,(, второй cutздесь не нужен, я включаю его только для того, чтобы показать, что вы можете использовать точно такую ​​же команду):

$ echo 'string/more!99' | cut -d'!' -f2- | cut -d, -f1
99

Другой вариант:sed:

$ echo 'string/more!99,string/more!98,string/more!97' | 
    sed -E 's/^[^!]+!([0-9]+).*/\1/'
99
$ echo 'string/more!99' | sed -E 's/^[^!]+!([0-9]+).*/\1/'
99

илиperl:

$ echo 'string/more!99,string/more!98,string/more!97' | 
    perl -pe 's/.+?!(\d+).*/\1/'
99
$ echo 'string/more!99' | perl -pe 's/.+?!(\d+).*/\1/'
99

Или ГНУgrep

$ echo 'string/more!99,string/more!98,string/more!97' | 
    grep -oP '^[^!]+!\K\d+'
99
$ echo 'string/more!99' | grep -oP '^[^!]+!\K\d+'
99
2
18.03.2021, 22:24

Все, что вам нужно, это синтаксис расширения параметров оболочки :это было сделано в

$ input='stringhere/morestring!99'
$ echo "${input#*!}"
99

За #следует шаблон :кратчайшийпрефикс , соответствующий этому шаблону, удаляется.

$ input='string/more!99,string/more!98,string/more!97'
$ first=${input%%,*}
$ echo "${first#*!}"
99

За %%следует шаблон :удаляется самый длинныйсуффикс , соответствующий шаблону.


${var#pattern)--кратчайший соответствующий префикс удален.
${var##pattern)--удален самый длинный совпадающий префикс.
${var%pattern)--кратчайший суффикс удален.
${var%%pattern)--удален самый длинный соответствующий суффикс.

0
18.03.2021, 22:24

Вы также можете использовать sed. Использование GNU sedс включенными расширенными регулярными выражениями:

sed -E 's/^[^!]*!([0-9]+).*$/\1/'

или -более портативный:

sed 's/^[^!]*!\([0-9]\{1,\}\).*$/\1/p'

Это будет соответствовать шаблону «все до первой !, за которой следует одна или несколько цифр и, возможно, любые символы после этого до конца -строки -», и заменит всю строку только с частью «одна или несколько цифр».

~> echo 'string/more!99,string/more!98,string/more!97' | sed -E 's/^[^!]*!([0-9]+).*$/\1/'
99

Если есть несовпадающие строки, их можно подавить с помощью

sed -nE 's/^[^!]*!([0-9]+).*$/\1/p'

вместо этого. По умолчанию это ничего не выведет, а выведет вывод только в том случае, если найден соответствующий шаблон.

0
18.03.2021, 22:24

Теги

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