Візьміть певний вміст файлу


9

Тому я знаю, що для цієї проблеми існують інструменти, тому що я чув про них, але не знаю, що вони є.

Я хочу зробити щось на кшталт відфільтрувати всі дані, крім імен користувачів у / etc / passwd.

Наприклад, я хотів би захопити user1, user2 та user3 з наступного файлу. У цьому випадку логікою може бути "Захоплення тексту до першого": "у кожному рядку файлу".

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

Вихід буде:

user1
user2
user3

Відповіді:


19

cutіснує саме для цієї мети. -dПрапор вказує роздільник, і -fвизначає , які поля для виведення:

cut -d: -f1 /etc/passwd

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


13

Кожен раз, коли ви бажаєте витягнути дані з табличного вводу, вам слід розглянути можливість awk . Він доступний практично в будь-якій системі Unix, тому корисно приймати:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': визначає ":" як роздільник стовпця.
  • '{}': виконати цю інструкцію для кожного рядка.
  • print $1: друк першого стовпця на екрані.

3
Випадкова примітка: awkбере ім’я файлу, тож ви можете пропустити трубу і просто зробитиawk -F: '{print $1}' /etc/passwd
Michael Mrozek

Я, здається, завжди забуваю, що awk приймає ім’я файлу, я завжди, здається, використовую його в конвеєрі ... щось на зразок sed | awk etc.…
Matthew Brannigan

майже все, що працює з файлами, має ім’я файлу ( trі atє декількома прикладами кількох речей, які цього не роблять).
Призупинено до подальшого повідомлення.


1

Під perl and awk є третій інструмент для таких робіт:

sed 's/:.*//' FILE 

Це команда заміщення: заміна від двокрапки:, а потім крапка, яка є джокером для символів будь-якого виду, будь-якого рахунку (*), без нічого.

Це "s (ubstitute) / FROM / TO /", щоб TO було порожнім, що означає "видалити все з першого (оскільки sed за замовчуванням жадібний) двокрапки (до кінця рядка, оскільки sed добре працює з цілими рядками).

Звичайно cut, це добре командування, але я б сказав з іншої родини.


1

У вашому прикладі всі 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це не застосовується, тому що ви не можете передати команду FILE, щоб діяти як параметр.)


catпо - , як і раніше марно там: colrm 6 < FILE.
манатура

Ну так, але не так марно, як у дзвінках cat foo | grep bar.
користувач невідомий

1

Просто для повноти немає необхідності у зовнішніх командах, оболонка (оболонка Bourne або сумісна) може впоратися з нею самостійно:

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

Звичайно, це, мабуть, найповільніше з усіх можливих рішень, тому для величезних файлів виберіть інше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.