Допустим, что в течение вашего рабочего дня вы неоднократно сталкивались со следующей формой столбцового вывода какой-то команды в bash (в моем случае это выполнение svn st
в моем рабочем каталоге Rails):
? changes.patch
M app/models/superman.rb
A app/models/superwoman.rb
чтобы работать с выводом вашей команды - в данном случае с именами файлов - требуется какой-то синтаксический анализ, чтобы второй столбец можно было использовать в качестве входных данных для следующей команды.
То, что я делал, это использовал awk
для перехода ко второму столбцу, например, когда я хочу удалить все файлы (не то, что это типичный случай использования :), я бы сделал:
svn st | awk '{print $2}' | xargs rm
Поскольку я часто это печатаю, возникает естественный вопрос: есть ли более короткий (и, следовательно, более крутой) способ сделать это в bash?
ПРИМЕЧАНИЕ: я спрашиваю, по сути, вопрос о команде оболочки, хотя мой конкретный пример относится к моему рабочему процессу svn. Если вы считаете, что рабочий процесс глуп, и предлагаете альтернативный подход, я, вероятно, не буду вас опровергать, но другие могут, поскольку вопрос здесь заключается в том, как получить выходные данные команды n-го столбца в bash как можно более коротким способом. , Спасибо :)
Ответы:
Вы можете использовать
cut
для доступа ко второму полю:Изменить: Извините, не понял, что SVN не использует вкладки в своем выводе, так что это немного бесполезно. Вы можете настроить
cut
вывод, но он немного хрупкий - что-то вродеcut -c 10-
бы сработает, но точное значение будет зависеть от вашей настройки.Другой вариант что-то вроде:
sed 's/.\s\+//'
источник
cut -f2
сsvn st
выходом. Вы увидите, что это не работает.svn st
будет использовать вкладки в своем выводе. После некоторого тестирования кажется, что это не так. Черт.-d
это работало.cut -d" " -f2
.Для достижения того же, что и:
используя только bash вы можете использовать:
Конечно, это не короче, но немного более эффективно и правильно обрабатывает пробелы в ваших именах файлов.
источник
a
иb
как их получить?a
представляет первый столбец иb
представляет остальные столбцы. Если вы хотите напечатать второй столбец, используйте,read a b c;
а затем используйтеecho
вместоrm
. Я использовал это, чтобы получить кучу идентификаторов процесса, которые следовали шаблону grep, поэтому я мог прервать их все.Я оказался в той же ситуации и в итоге добавил эти псевдонимы в мой
.profile
файл:Что позволяет мне писать такие вещи:
источник
function c() { awk "{print \$$1}" }
Тогда вы можете сделать:svn st | c 2 | xargs rm
Попробуйте Zsh. Он поддерживает псевдоним суффикса, поэтому вы можете определить X в вашем .zshrc как
тогда вы можете сделать:
Вы можете сделать еще один шаг вперед и определить его для n-го столбца:
который выведет n-й столбец файла "file". Вы можете сделать это для вывода grep или для меньшего вывода. Это очень удобная и убийственная особенность Zsh.
Вы можете пойти еще дальше и определить D следующим образом:
Теперь вы можете ввести:
удалить все файлы, указанные в первом столбце файла «файл».
Если вы знаете bash, zsh не является чем-то большим, за исключением некоторых новых функций.
HTH Крис
источник
cut
вариант. Он просто не работает на моей машине с использованием выводаsvn st
. Попробуйтеsvn st | cut -d' ' -f2
просто посмотреть, что получится.Поскольку вы, кажется, не знакомы со сценариями, вот пример.
Если вы сохраните это
~/bin/x
и убедитесь, что~/bin
оно в вашемPATH
(теперь это то, что вы можете и должны добавить в свой.bashrc
), у вас будет кратчайшая команда для общего извлечения столбца n; х н.Скрипт должен выполнять правильную проверку ошибок и залог, если вызывается с нечисловым аргументом или с неправильным количеством аргументов и т. Д .; но расширение этой основной версии будет в блоке 102.
Возможно, вы захотите расширить скрипт, чтобы разрешить другой разделитель столбцов. Awk по умолчанию анализирует ввод в поля на пробелах; использовать другой разделитель, используйте
-F ':'
где:
новый разделитель. Реализация этого в качестве опции для скрипта делает его немного длиннее, поэтому я оставляю это как упражнение для читателя.использование
Учитывая файл
file
:Вы можете либо передать его через stdin (используя бесполезный
cat
просто как заполнитель для чего-то более полезного);Или предоставьте это в качестве аргумента скрипту:
Здесь
sh script.sh
предполагается, что скрипт сохраняется какscript.sh
в текущем каталоге; если вы сохраняете его с более полезным именем где-то в вашей папкеPATH
и помечаете его как исполняемый, как в приведенных выше инструкциях, очевидно, используйте вместо этого полезное имя (и нетsh
).источник
awk -v col=$col ...
cat
примеру по истерическим причинам (-:Похоже, у вас уже есть решение. Чтобы упростить задачу, почему бы просто не поместить свою команду в скрипт bash (с коротким именем) и просто запустить ее вместо того, чтобы каждый раз вводить эту «длинную» команду?
источник
.bashrc
? Зачем вам это загромождать не связанными с bash материалами? Я пишу отдельные сценарии для каждого «набора» команд и помещаю их в~/scripts
каталог. Затем добавьте все~/scripts
в мой,PATH
чтобы я мог просто называть их по имени, когда они мне нужны.Если вы в порядке с выбором столбца вручную, вы можете очень быстро использовать команду pick :
Просто перейдите в любую ячейку 2-го столбца, нажмите,
c
а затем нажмитеenter
источник
Обратите внимание, что путь к файлу не обязательно должен быть во втором столбце вывода svn st. Например, если вы измените файл и измените его свойство, это будет 3-й столбец.
Смотрите возможные примеры вывода в:
Пример вывода:
Я предлагаю сократить первые 8 символов:
Если вы хотите быть уверены на 100% и иметь дело с причудливыми именами файлов, например, с пробелами в конце, вам нужно проанализировать вывод xml:
Конечно, вы можете захотеть использовать настоящий XML-парсер вместо grep / sed.
источник