如何从文件中打印特定单词

如何从文件中打印特定单词

我有一个像这样的文件

user:[dgalanos] rid:[0xa35]
user:[roleary] rid:[0xa36]
user:[smorgan] rid:[0xa37]

我怎样才能只打印这样的用户名

dgalanos
roleary
smorgan

我试过

cat users.txt | awk -F  ':' '{print $2 > "users3.out"}'

但它并没有给我期望的正确结果。

答案1

如果您将冒号设置为字段分隔符,则该行

user:[dgalanos] rid:[0xa35]

将拆分为

user
[dgalanos] rid
[0xa35]

我猜你想在冒号处拆分或者空格,然后删除括号:

此外,awk默认从文件读取,不需要cat

awk -F  '[: ]' '{gsub(/[][]/,"",$2); print $2}' users.txt > users3.out

或者使用括号作为字段分隔符:

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

无论如何,对于这样的任务,我更喜欢grep

grep -Po 'user:\[\K[^]]*' users.txt > users3.out

答案2

最简单的方法是修改命令如下:

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

  • 我使用两个管道符awk来首先捕获 之后的内容[,然后捕获 之后的内容]。您感兴趣的分隔符不是分号,而是括号。
  • 管道|意味着第一个命令的输出被用作第二个命令的输入。awk如果单独使用第二个命令,则第二个命令不起作用,但只有将其通过管道传输到第一个命令时,它才有意义。
  • 管道传输时,您不必重复输入文件:因此,第二个文件中awk没有重复的输入文件users.txt。如果您想awk单独使用第二个文件,请这样写:awk -F ']' '{print $1}' users.txt
  • 您不需要重定向cat输出到awk因为awk可以接受文件作为输入
  • 到输出文件的重定向不能在awk命令内部,而必须在完整命令的末尾。

如果希望在终端中而不是文件中看到结果,则可以从中删除部分>

有一个更优雅的方式获取数据时无需通过管道传输两个awk命令,而是定义两个括号作为分隔符:

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

相关内容