如何在单列上运行grep?


42

我想grep ls -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

我只想grep rahmu在列$ 3 上运行,所以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上。

注意:我不是在寻找一种方法来查找属于给定用户的所有文件。这个例子只是为了使我的问题更清楚。


5
请注意,解析的输出ls本质上是脆弱的(想想如果用户名包含空格,会发生什么—是的,在某些平台上会发生这种情况)。使用find代替。
吉尔(Gilles)'所以

这不回答这个问题的标题,但我会提的是,--printf选项stat可能会派上用场在,否则你可能考虑解析的地方ls。但通常,find这就是您想要的(如@Gilles所述)。
通配符'18

Answers:


49

awk节省一整天!

这是使用相对简单的语法的一种直接方法:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

甚至更简单:(感谢Peter.O的评论)

ls -l | awk '$3 == "rahmu"' 

9
或者:ls -l | awk '$3=="rahmu"'...顺便说一下,开(括号应该在if... 之后awk '{if($3 ...'
Peter.O 2012年

3
@ Peter.O +1来自我。您的命令更加简洁,正确,因为awk匹配的默认命令是print。
2012年

为避免本地化问题(日期格式会影响列顺序),通常建议确保标准格式和语言:LANG=C ls -l | awk ...
fheub 2012年


11

如果按列表示固定大小的列,则可以:

ls -l | grep "^.\{15\}rahmu"

其中^表示行的开头,.表示任何字符,并且\{15\}表示前一个字符正好出现15次(在这种情况下为任何字符)。


2

我知道我参加晚会很晚,但是我相信这个问题的一个非常通用的解决方案是将awk与正则表达式一起使用,如下所示:

awk '$3~/rahmu/{print}' input_file

用“ //”括起来的部分可以是任何形式的正则表达式。


1

要基于单个用户名列(仅打印文件)进行grep,您可以尝试:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

对于目录,请更改-d,对于任何类型,请删除-

基本上,它选择\S\+\s\+与非空格字符匹配的每一列,再由空格字符匹配,因此我们先匹配前三列,然后匹配用户名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.