用于按 getent passwd 中用户名的字母顺序对列表进行排序的 AWK 脚本

AWK script to sort the list in alphabetical order of usernames in getent passwd

我是 awk 的新手,我正在尝试按字母顺序对第五组包含“Zack e”的用户名进行排序。我在我的终端输入 getent passwd,它们是:

zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false
hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash

这个方法我也试过

for i in `sed -e 's/.* \(\d\)*//' passwd.in | sort`; do grep $i passwd.in; done > file_sort.txt

但它所做的只是对第一组而不是所需的组进行排序。我如何将我的方法与 awk 脚本结合起来我所知道的在 awk 中要做的是 BEGIN {FS = ":"} == 1000{print }

有什么办法,我可以重新排列令牌以便排序可以工作,然后将它们放回原位?

为什么 'awk' 'sort' 可以优雅地完成这项工作?

sort -t : -k5 myFile.txt

或者反过来

sort -r -t : -k5 myFile.txt

使用 GNU awk 和 for scanning order</code> 对每条记录唯一时在输出中排序:</p> <pre><code>$ awk -F: '{a[]=[=10=]}END{PROCINFO["sorted_in"]="@ind_str_asc";for(i in a)print a[i]}' file

输出:

bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false

解释:

$ awk -F: '{                              # set field delimiter
     a[]=[=12=]                             # hash records, use  as key
}
END {
    PROCINFO["sorted_in"]="@ind_str_asc"  # set the for traverse order
    for(i in a)                           # use it
        print a[i]                        # output
}' file

由于散列键是 </code>,因此它需要是唯一的以避免冲突。如果它们不是唯一的,我想在这种情况下,记录是唯一的,你可以:</p> <pre><code>$ awk -F: '{ a[[=13=]]= # changed } END { PROCINFO["sorted_in"]="@val_str_asc" # changed for(i in a) print i # changed }' file

当然还有函数 asortasorti 对数组进行排序,如上面的示例在输出时排序。例如,我们希望 $5 不是唯一的:

$ awk -F: '{
    a[[=14=]]=                      # record is unique,  is not expected to be
}
END {
    n=asorti(a,b,"@val_str_asc")  # asorti to preserve [=14=] in b but order from a[] value
    for(i=1;i<=n;i++)             # sorted to b, index rewritten from 1..n
        print i, b[i]
}' file

现在输出:

1 bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
2 armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
3 hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
4 zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false