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

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

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

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

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

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

 user1 user2 user3 

  • Извлечь ключевое слово из строки
  • Объединение трех последовательных строк с заменой
  • Как изменить первую строку только на определенные файлы в папке с помощью sed
  • sed - применять изменения в нескольких файлах
  • sed, чтобы заменить пустую строку двумя строками содержимого
  • Как использовать соответствующее регулярное выражение для поиска шаблона в sed?
  • Работает ли ] для sed шаблонов на всех дистрибутивах Linux?
  • Удалить столбец массива из файла CSV
  • 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 

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

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.