Скажем, я запускаю команду SayStuff
$ SayStuff
и вывод
Watermelons and cucumbers
Сейчас. Скажем, я хочу извлечь подстроку cucumbers
из вывода и передать ее во что-то.
Я бы сделал это программно, разделив выходные данные на массив по разделителю Space и сославшись на него ArrayName[2]
. Я довольно плохо знаком с сценариями оболочки, и мне удалось выкопать только полукриптические cut
примеры, ни один из которых не имел смысла.
Есть идеи?
linux
command-line
bash
krystah
источник
источник
cut
не будет обрабатывать переменное количество пробелов, аawk
делать.Я бы, вероятно, использовал один из вариантов, уже предоставленных @slhck, но вот еще несколько способов сделать это:
Используя массивы, как на любом другом языке:
var=()
Объявляет массив,$(command)
сохраняет вывод команды. Таким образом,foo=( $(SayStuff) )
сохраняет выводSayStuff
в массивfoo
и yuou, тогдаecho
это третий элемент с${foo[2]}
.sed
Команда
sed
подставит (s///
) все с последним словом. Регулярное выражение сопоставляет что угодно, вплоть до пробела (.*
), которое будет соответствовать всему, вплоть до последнего пробела, а затем захватывает последнее слово(\(.*\)
. Поскольку слово было захвачено, мы можем ссылаться на него как\1
.Более простая версия:
удар
При этом используются возможности манипуляции со строками в bash, подробности см. Здесь .
Больше Баш
Perl, где, конечно, есть много способов сделать это:
В
-a
маркеperl
ведет себя какawk
, расщепление линии на пробельном и сохранении в массив@F
. Затем мы печатаем последний элемент@F
($#F
это количество элементов в@F
).-l
Говорит Perl , чтобы добавить новую строку в каждомprint
заявлении,-n
что он должен обрабатывать STDIN построчно и-e
что он должен запустить скрипт заданный в командной строке.Опции были объяснены выше, мы просто удаляем все до последнего пробела и печатаем (
-p
).Здесь мы передаем в
Watermelons and cucumbers
качестве аргументов, которые Perl будет сохранять в@ARG
массиве, и поэтому мы печатаем последний элемент@ARG
.обман. Этот используется
sed
для преобразования пробелов в новые строки, а затемtail
для печати только последней строки.grep и регулярные выражения, с помощью
-o
которых печатается только совпадающая строка.мошенничество
источник
Вот еще несколько объяснений:
Так что если вам нужно 3-е поле, и оно разделено пробелами '', то это
Если вы хотите поле LAST, вы, вероятно, должны использовать awk .
В этом случае это становится:
В
awk
NF - количество полей в строке, что$NF
означает последнее поле в строке.источник