Захватите определенное содержание файла

Это не регулярные выражения, они - примеры расширения параметра Bash: замена переменной или специального параметра его значением. Wiki Wooledge имеет хорошее объяснение.

В основном в примере Вы имеете, ${0##*/} переводит как:

за переменные 0$, и шаблон '/', два хеша, средние с начала параметра, удаляют самое длинное (или жадный) соответствие — до и включая шаблон.

Так, где $0 название файла, например, $HOME/documents/doc.txt, затем параметр был бы расширен как: doc.txt

Точно так же для ${0%/*}, шаблон / подобран против конца параметра ( %), с самым коротким или нежадным удаленным соответствием – который в примере выше дал бы Вам $HOME/documents.

См. также статью о Хакере Bash Wiki.

9
28.06.2012, 09:05
6 ответов

cut существует для точно этой цели. -d флаг указывает разделитель, и -f указывает который поля произвести:

cut -d: -f1 /etc/passwd

Аргумент -f может быть что-то как 1,3 показать первые и третьи поля, или 1-3 показать первые три; существуют также -b и -c флаги для чтения байтов и символов вместо полей. Если Вам нужно что-то более гибкое, обычно awk добьется цели (см. ответ Matthew),

19
27.01.2020, 20:04

Каждый раз, когда Вы хотите извлечь данные из табличного входа, необходимо рассмотреть awk. Это доступно в фактически каждой системе Unix, таким образом, это - хорошая привычка взять:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': определяет ":" как разделитель столбца.
  • '{}': выполните эту инструкцию для каждой строки.
  • print $1: распечатайте первый столбец на экран.
13
27.01.2020, 20:04
  • 1
    Случайное примечание: awk берет имя файла, таким образом, можно пропустить канал и просто сделать awk -F: '{print $1}' /etc/passwd –  Michael Mrozek♦ 30.08.2010, 05:56
  • 2
    , я всегда, кажется, забываю, что awk берет имя файла, я всегда, кажется, использую его в конвейере... что-то как sed | awk и т.д.... –  Matthew Brannigan 30.08.2010, 17:39
  • 3
    почти все, что работает с файлами, берет имя файла (tr и at пара примеров нескольких вещей, которые не делают). –  Paused until further notice. 31.08.2010, 01:04

Вот острота Perl:

perl -F/:/ -lane 'print $F[0]' /etc/passwd
3
27.01.2020, 20:04

Под жемчугом и awk, существует третий инструмент для таких заданий, который является sed:

sed 's/:.*//' FILE 

Это - команда замены: замена от двоеточия: сопровождаемый точкой, которая является шутником для символов любого вида, любого количества (*), ни с чем.

Это (заменяют) / ИЗ/В /' с К тому, чтобы быть пустым, что означает, 'удаляют все сначала (так как sed является по умолчанию жадным) двоеточие (пока конец строки, так как sed работает хорошо со всеми строками).

Конечно, cut прекрасная команда также, но я сказал бы от другого семейства.

1
27.01.2020, 20:04

В Вашем примере все 3 имени имеют ту же длину. В таких случаях - который мог бы произойти, но не настолько, вероятно, с/etc/passwd - Вы могли бы использовать colrm также:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

или, конечно

cat FILE | colrm 6 

(редкий случай, где useless use of cat не применяется, потому что Вы не можете вручить colrm ФАЙЛ для действия на как параметр.)

1
27.01.2020, 20:04
  • 1
    cat все еще бесполезно там: colrm 6 < FILE. –  manatwork 28.06.2012, 10:10
  • 2
    Ну, да, но не, что бесполезный, как в вызове cat foo | grep bar. –  user unknown 28.06.2012, 12:50

Только для полноты, нет никакой потребности во внешних командах, оболочка (Оболочка Bourne или совместимый) может обработать ее один:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

Конечно, это является, вероятно, самым медленным из всех возможных решений, таким образом, для огромных файлов выбирают другого.

1
27.01.2020, 20:04

Теги

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