Рейтинг:0

Как напечатать определенные слова из файла

флаг za

у меня есть такой файл

пользователь: [dgalanos] рид: [0xa35]
пользователь:[roleary] rid:[0xa36]
пользователь: [сморган] рид: [0xa37]

Как я могу напечатать только такие имена пользователей

дгаланос
ролевой
сморган

Я пытался

кот пользователи.txt | awk -F ':' '{print $2 > "users3.out"}'

Но это не дало мне правильного результата, которого я ожидал.

αғsнιη avatar
флаг cn
не используйте [перенаправление awk](https://www.gnu.org/software/gawk/manual/html_node/Redirection.html) в `awk '{print $2 > "users3.out"}' input`, когда вы не нужно, и вы действительно хотели, чтобы перенаправление оболочки `awk '{print $2}' input > users3.out `.
Рейтинг:1
флаг in

Если вы установите двоеточие в качестве разделителя полей, строка

пользователь: [dgalanos] рид: [0xa35]

будет разделен на

пользователь
[dgalanos] избавиться
[0xa35]

Я думаю, вы хотите разделить двоеточие или же пробел, затем снимите скобки:

Также, аук по умолчанию чтение из файла, нет необходимости кот:

awk -F '[: ]' '{gsub(/[][]/,"",$2); напечатать $2}' users.txt > users3.out

Или вы используете скобки в качестве разделителя полей:

awk -F '[][]' '{print $2}' users.txt > users3.out

В любом случае, для такой задачи я бы предпочел grep:

grep -Po 'пользователь:\[\K[^]]*' users.txt > users3.out
Рейтинг:0
флаг gr

Самый простой способ — изменить вашу команду следующим образом:

awk -F '[' '{print $2}' users.txt | awk -F ']' '{print $1}' > users3.out

  • я использую двухканальный аук поймать сначала то, что после [ а потом что после ]. Разделитель, который вас интересует, - это не точка с запятой, а скобки.
  • Трубопровод | означает, что вывод первой команды используется как ввод второй команды. Второй аук не работает, если вы используете его отдельно, но имеет смысл, только если вы передаете его первой команде.
  • При пайпинге не нужно повторять входной файл: по этой причине во втором аук нет повторения входного файла пользователи.txt. Если вам интересно использовать второй аук в одиночку, напишите: awk -F ']' '{print $1}' users.txt
  • Вам не нужно перенаправлять кот вывод в аук так как аук может принимать файлы в качестве входных данных
  • Ваше перенаправление на выходной файл не должно находиться внутри аук команда, но в конце полной команды.

Если вы хотите видеть результаты в терминале, а не в файле, вы можете удалить часть из >

Существует более элегантный способ чтобы получить данные без конвейера два аук команды, но определяя две скобки как разделители:

awk -F '[][]' '{print $2}' users.txt > users3.out

tcprks avatar
флаг za
Команда дает желаемый результат. Однако можете ли вы объяснить, почему вторая команда печати ничего не напечатала. awk -F '[' '{print $2}' users.txt | awk -F ']' '{print $1}' . Это что-то вроде оператора AND. он печатает только в том случае, если выполняются оба условия до/после канала.
Lorenz Keel avatar
флаг gr
проверьте мой отредактированный ответ, он должен развеять ваши сомнения.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.