我有一个像这样的文件
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