我需要帮助来理解 awk Linux 命令

I need help understanding a awk Linux Command

awk -F: '!( < 512 && < 30)' /etc/passwd 在 Linux 中做什么?我只发现 awk 是一种脚本语言,但无法理解这一切。

这是shorthand

awk -F: '!( < 512 &&  < 30) { print; }' /etc/passwd

表示“显示 NOT(: 分隔的字段 #3 小于 512 且字段 #4 小于 30)的所有行”来自 /etc/passwd

借助man 5 passwd和DeMorgan定律,这对应于“显示用户id大于512或组id大于30的用户帐户列表”。

此逻辑可能旨在仅显示系统上的人类用户,因为通常的惯例是为他们分配比 non-human 更高的 UID,系统用户如 apache 和 mysql.

awk 世界基于模式 condition{action},这适用于输入文件的每个输入 record/input 行。

如果缺少 {action} 则执行默认操作 = print 这实际上意味着 print [=14=]
如果缺少 (condition),则使用默认条件 true

-F: 将字段分隔符调整为 : 而不是 awk 默认的字段分隔符 [[space]]。 awk 中的字段分隔符几乎可以是任何东西,包括正则表达式和逻辑(即或)表达式。

</code> , <code> 输入行的第 3 和第 4 个字段(在您的代码中由 : 分隔)

( < 512 && < 30)是条件,&&是AND运算符。

条件前面的

!只是一个NOT运算符,用来反转(condition)

的逻辑

awk 更多有趣的选项:

[=27=] : 是从文件中读取的整个输入行,没有拆分
$NF : 是输入行的最后一个字段
NF : 是字段数
RS:输入的record/line分隔符可以调整为不是\n(awk默认)
ORS : 输出记录分隔符(awk默认是\n)
尝试 : echo "one two three" | awk '{print }'
echo "one two three" |awk '1' RS=" " ORS="\n"

关于 awk 的更多信息可以在 man awkinfo awk 或官方 awk 文档中找到,即 https://www.gnu.org/software/gawk/manual/gawk.html for gnu awk - gawk