如何在单列上运行 grep?

如何在单列上运行 grep?

我想 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\+匹配非空格字符后跟空格字符的每一列,因此我们匹配前三列,然后匹配用户名。

相关内容