我想 grepls -l
命令的输出:
-rw-r--r-- 1 root root 1866 Feb 14 07:47 rahmu.file
-rw-r--r-- 1 rahmu user 95653 Feb 14 07:47 foo.file
-rw-r--r-- 1 rahmu user 1073822 Feb 14 21:01 bar.file
我只想在 $3 列上运行grep rahmu
,因此命令的输出grep
应如下所示:
-rw-r--r-- 1 rahmu user 95653 Feb 14 07:47 foo.file
-rw-r--r-- 1 rahmu user 1073822 Feb 14 21:01 bar.file
最简单的方法是什么?答案必须是可移植到许多 Unices 上,最好集中在 Linux 和 Solaris 上。
注意:我并不是在寻找一种方法来查找属于给定用户的所有文件。给出这个例子只是为了让我的问题更清楚。
答案1
再一次awk
就能挽救局面!
这是一种简单的方法,语法相对简单:
ls -l | awk '{if ($3 == "rahmu") print $0;}'
甚至更简单:(感谢评论中的Peter.O)
ls -l | awk '$3 == "rahmu"'
答案2
如果您希望仅匹配给定列上的部分字符串,您可以使用以下建议https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
some_command | awk '$6 ~ /string/'
答案3
如果按列,您指的是固定大小的列,您可以:
ls -l | grep "^.\{15\}rahmu"
其中^
表示行的开头,.
表示任何字符,并且\{15\}
表示前一个字符恰好出现 15 次(本例中为任何字符)。
答案4
要基于单个用户名列(并且仅打印文件)进行 grep,您可以尝试:
ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"
对于目录,更改-
为d
,对于任何类型,更改为 remove -
。
它基本上选择\S\+\s\+
匹配非空格字符后跟空格字符的每一列,因此我们匹配前三列,然后匹配用户名。