У меня есть команда, например: echo "word1 word2"
. Я хочу поставить |
вертикальную черту ( ) и получить слово 1 из команды.
echo "word1 word2" | ....
Я не знаю, что поставить после трубы.
Awk - хороший вариант, если вам нужно иметь дело с конечными пробелами, потому что он позаботится об этом за вас:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
Однако Cut об этом не позаботится:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
Здесь 'cut' ничего не печатает / пробел, потому что первым перед пробелом был другой пробел.
-F","
чтобы переопределить разделитель полей по умолчанию (пробел) с помощью запятой.нет необходимости использовать внешние команды. Сам Bash справится с этой задачей. Предположим, что "word1 word2" вы откуда-то взяли и сохранили в переменной, например
теперь вы можете присвоить $ 1 или $ 2 и т.д. другой переменной, если хотите.
источник
stdin
. @Matt M.--
означаетstdin
, что$string
это передается какstdin
.stdin
является разделенный пробелами в аргументы$1
,$2
,$3
и т.д. - так же , как когда Bash Программа оценивает аргументы (например , проверка$1
,$2
и т.д.), этот подход имеет преимущество тенденции оболочки, чтобы расколотьstdin
автоматически в аргументы, устраняя необходимостьawk
илиcut
.set
задает аргументы оболочки.word1=$(IFS=" " ; set -- $string ; echo $1)
Настройте IFS для правильного распознавания пробелов между словами. Заключите в круглые скобки, чтобы не повредить исходное содержимое $ 1.string="*"
. Сюрприз.Я думаю, что одним из эффективных способов является использование массивов bash:
Кроме того, вы можете напрямую читать массивы в конвейере:
источник
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. Сюрприз.while
синтаксис, чтобы получить каждое первое слово в каждой строке. В противном случае используйте подход Boontawee Home. Также обратите внимание, чтоecho "${array[0]}"
это цитируется для предотвращения расширения, замеченного gniourf-gniourf.Это имеет то преимущество, что не используются внешние команды и остаются неизменными переменные $ 1, $ 2 и т. Д.
источник
$1, $2, …
нетронутыми - чрезвычайно полезная функция для написания скриптов!Если вы уверены, что в начале нет пробелов, вы можете использовать замену параметра bash:
Не упустите возможность избежать единого пространства. Дополнительные примеры шаблонов замены см. Здесь . Если у вас bash> 3.0, вы также можете использовать сопоставление регулярных выражений, чтобы справиться с ведущими пробелами - см. Здесь :
источник
Вы можете попробовать awk
С awk действительно легко выбрать любое слово, которое вам нравится ($ 1, $ 2, ...)
источник
Использование расширения параметров оболочки
%% *
Вот еще одно решение, использующее расширение параметра оболочки . Он заботится о нескольких пробелах после первого слова. Обработка пробелов перед первым словом требует одного дополнительного расширения.
объяснение
Знак
%%
означает удаление самого длинного из возможных совпадений*
(пробел, за которым следует любое количество любых других символов) в конечной частиstring
.источник
Мне было интересно, как можно сравнить несколько лучших ответов с точки зрения скорости. Я проверил следующее:
1 @ mattbh's
2 @ ghostdog74's
3 @ boontawee-home's
и 4 @ boontawee-home's
Я измерил их с помощью Python timeit в сценарии Bash в терминале Zsh на macOS, используя тестовую строку из 215 5-буквенных слов. Выполняли каждое измерение пять раз (все результаты были для 100 петель, лучше всего из 3) и усредняли результаты:
Хорошая работа, избиратели 👏 Количество голосов (на момент написания) соответствует скорости решений!
источник
read -a
недействительно в тире).cut вырезает первое поле (-f 1) из списка полей, разделенных строкой "" (-d "")
источник
read
твой друг:Если строка находится в переменной:
Если вы работаете в канале: первый случай: вам нужно только первое слово первой строки:
второй случай: вам нужно первое слово каждой строки:
Они работают, если есть ведущие пробелы:
источник
Поскольку perl включает в себя функциональность awk, это также можно решить с помощью perl:
источник
Я работал со встроенным устройством, в котором не было ни Perl, ни awk, ни Python, и вместо этого делал это с помощью sed. Он поддерживает несколько пробелов перед первым словом (которое
cut
иbash
решения не справиться).Это было очень полезно при поиске
ps
идентификаторов процессов с помощью grep, поскольку другие решения здесь, использующие только bash, не смогли удалить первые пробелы, которыеps
используются для выравнивания.источник