示例:
文件list.txt:
$ cat list.txt
/apps
/log
/data
$ for i in `cat list.txt`; do
> ls -ld $i | awk '{print $3}'
> done
appuser1
appuser2
appuser3
$ for i in `cat list.txt`; do
> ls -ld $i | awk '{print $3}'
> done | while read -r line ; do
> printf "%s For Filesystem $i "
> getent passwd $line | awk -F: '{print $5}'
> done
For Filesystem /data owner=User1
For Filesystem /data owner=User2
For Filesystem /data owner=User3
期望的结果应该是:
For Filesystem /apps owner=User1
For Filesystem /log owner=User2
For Filesystem /data owner=User3
实际上,list.txt文件是一个非常长的命令,它解析每个服务器上的/ proc / mounts文件,并且需要将此列表重定向到。
答案 0 :(得分:2)
我建议您将脚本更改为以下内容:
while read -r line; do
owner=$(stat -c"%U" "$line")
echo "For Filesystem $line owner=$owner"
done < list.txt
while read
循环一次读取list.txt
一行。 stat
用于提供有关文件或目录的信息。 -c
开关允许您为输出指定格式字符串。 %U
是所有者的用户名。
一般情况下,您不应该解析ls
,在这种情况下不必使用cat
。
在回复你的评论时,如果不是使用文件,你想传递另一个进程的输出,你可以这样做:
while read -r line; do
owner=$(stat -c"%U" "$line")
echo "For Filesystem $line owner=$owner"
done < <(awk '{print $2}' /proc/mounts)
无需将其他命令的输出存储在变量中。如果您想要使用变量,您可以使用:
filesystems=$(awk '...' /proc/mounts)
在循环之前,然后是:
done <<<"$filesystems" # less portable (works on bash)
或:
done < <(echo "$filesystems") # extra process, slightly longer