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

Поэтому я знаю, что существуют инструменты для этой проблемы, потому что я слышал о них, но я не знаю, что это такое.

Я хочу сделать что-то вроде фильтрации всех данных, но имена пользователей в / etc / passwd.

Например, я хотел бы захватить user1, user2 и user3 из следующего файла. В этом случае логикой может быть «Перенести текст до первого»: «на каждую строку файла».

user1:x:1:4 user2:x:2:5 user3:x:3:6 

Результатом будет:

 user1 user2 user3 

6 Solutions collect form web for “Захватить определенное содержимое файла”

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

 cut -d: -f1 /etc/passwd 

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

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

 awk -F':' '{print $1}' /etc/passwd 
  • -F':' : определяет «:» как разделитель столбцов.
  • '{}' : выполнить эту инструкцию для каждой строки.
  • print $1 : напечатать первый столбец на экране.

Вот однострочный Perl:

 perl -F/:/ -lane 'print $F[0]' /etc/passwd 

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

 sed 's/:.*//' FILE 

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

Это (ubstitute) / FROM / TO / 'с TO пустым, что означает «удалить все из первого (поскольку sed по умолчанию жадный) двоеточие (до конца строки, так как sed хорошо работает со всеми строками).

Конечно, cut – прекрасная команда, но я бы сказал, что это другая семья.

В вашем примере все 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 не применяется, потому что вы не можете передать кол-во ФАЙЛА, чтобы действовать как параметр.)

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

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

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

  • Проверка формата имени файла в оболочке linux
  • Sed - Заменить первые k экземпляров слова в файле
  • Полосы пробелов после одиночных заглавных букв с sed
  • Добавление имени dir в список файлов
  • Извлечение пяти случайных элементов из списка с помощью sed
  • Как сопоставить шаблон и заменить только часть шаблона?
  • удалить содержимое с начала на первую пустую строку
  • Эффективно удалите первую пару строк из текстового файла
  • печатать все после косой черты
  • Печать только уникальных строк из файла, а не дубликатов
  • Обработка текста для извлечения полей структуры
  • Как включить все до Colon в Sed / Grep / ...?
  • Linux и Unix - лучшая ОС в мире.