【问题标题】:UNIX: Using awk commands to filter lists?UNIX:使用 awk 命令过滤列表?
【发布时间】:2012-05-21 13:56:11
【问题描述】:

我想知道我正在使用的命令中的语法错误是什么。

在当前目录中,我使用命令ls -l 来检索我目录中的文件权限。

我将如何进行查询以查看用户可读、可写和可执行的文件,然后使用 awk 打印过滤列表?

我知道我感兴趣的是第二个、第三个和第四个。

例如,

-rw-r----- .. .. .. ..

drw-r----- .. .. .. ..

我有一个awk命令如下:

ls -l | awk '{if{$1 == /.rwx....../}print "line"}'

我尝试了很多方法,但仍然存在语法错误。

非常感谢任何帮助!提前致谢!

【问题讨论】:

  • 如果你的系统有stat,你应该使用它而不是parsing ls。此外,如果您的find 支持它,请尝试find -perms u=rw -type f 或其他权限,例如u=rwx-g=x/u=w,g=w。有关这些模式的含义的信息,请参阅man find

标签: unix permissions awk


【解决方案1】:

用于检查字符串是否匹配正则表达式的运算符是~,而不是==。另外,在if 语句中的条件周围使用()

ls -l | awk '{ if ($1 ~ /.rwx....../) print "line" }' 

【讨论】:

  • 啊,请注意,我在问题中打错了字。即使 ~ 它仍然给我一个语法错误。但是括号。这就是问题所在。非常感谢您的帮助!
【解决方案2】:

我同意丹尼斯的观点;最好避免使用管道ls,如果您要执行某项操作,不妨使用stat 正确执行:

stat -c '%A %N' * | awk '/^-rwx/ { print $2 }' | sed "s%^.\(.*\).$%\1%"

或者只是在 awk 中:

stat -c '%A %N' * | awk '/^-rwx/ { print substr ($2, 2, length ($2) - 2) }'

编辑:

上述失败,文件包含空格(对不起)。这考虑了空格和换行符:

stat -c '%A %N' * | awk '/^-rwx/ {print substr($0, 13, length($0) - 13) }'

【讨论】:

  • 使用$2 的问题是它对于名称中带有空格的文件会失败。这可能会更好:stat -c '%A %N' * | awk '/^-rwx/ {print substr($0, 13, length($0) - 13) }'(或者您可以使用 %nprint substr($0, 12)
  • @DennisWilliamson 啊,是的,我的一个班轮找不到包含空格的文件。另外,我认为%n 失败,文件包含换行符:\n 得到扩展?
猜你喜欢
  • 1970-01-01
  • 2017-11-10
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2021-08-29
  • 2017-12-06
相关资源
最近更新 更多