凭借我生锈的bash技能,我试图做到以下几点:
到目前为止,我有这个:
[user1@test2 ~]$ sudo awk -F: '{if ($3 > 500) {system("lastlog -u" $1)} }' /etc/passwd | grep -iv username
oracle **Never logged in**
user1 pts/0 hostname Tue Mar 31 16:18:42 +1300 2015
user2 **Never logged in**
和此:
[user1@test2 ~]$ sudo awk -F: '{if ($3 > 500) {print $1 "," $3 "," $5}}' /etc/passwd
nfsnobody,65534,Anonymous NFS User
oracle,54321,
user1,54324,Test user1
我希望像这样在一行中获取所有内容:
oracle,54321,,**Never logged in**
user1,54324,Test user1,pts/0 hostname Tue Mar 31 16:18:42 +1300 2015
不确定如何连接两者,并用逗号替换空格。
有人可以提供建议吗?谢谢!
答案 0 :(得分:1)
试试这个:
awk -F':' '$3 > 500 {("lastlog -u" $1 | getline a); print $1,$3,$5,a}' OFS=',' /etc/passwd
$3 > 500
确保UID(第3列)大于500 ("lastlog -u" $1 | getline a)
将输出保存到变量" a"。此输出应该等同于您的system("lastlog -u" $1)
- 我实际上没有这个功能,但我会认为这是有效的print $1,$3,$5,a
将打印您想要的任何列(此处我有第1,3,5栏,以及之前保存的" lastlog"输出)OFS=','
将使用输出字段分隔符作为逗号答案 1 :(得分:1)
这里不需要awk; bash可以完成内置所需的一切。 (对于此处的示例,请确保您的脚本以#!/bin/bash
开头,而不是#!/bin/sh
,或者使用bash scriptname
而不是sh scriptname
调用它们。
while IFS=: read -r username _ uid gid name homedir shell; do
((uid >= 500)) || continue
{ read; read; } < <(lastlog -u "$username")
if [[ $REPLY = *"Never logged in"* ]]; then
port=; from=; latest=
else
read _ port from latest <<<"$REPLY"
fi
echo "$username,$uid,$name,$homedir,$shell,$port,$from,$latest"
done < <(getent passwd)
顺便说一句,说join
&#34;不起作用&#34;肯定是错误的 - 加入一个lastlog
调用的输出比每个用户调用一次lastlog
要高效得多,并且可以这样做:
join -t, \
<(getent passwd | tr : , | sort -t, -k1,1) \
<(lastlog | sed -r -e 's/[*][*]Never logged in[*][*]//' \
-e 's@[[:space:]]+@,@g' | tail -n +2 | sort -t, -k1,1) \
| awk -F, '$3 >= 500'