我对 Bash 还很陌生,但我正在努力学习。我的问题是:
我正在运行这个 ps 来获取信息并发送到 /tmp/freememory.txt
#!/bin/bash
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head >/tmp/freememory.txt
cat "/tmp/freememory.txt"
输出是
PID PPID CMD %MEM %CPU
859 1 /usr/lib/snapd/snapd 1.3 0.0
890 1 /usr/bin/python3 /usr/share 0.9 0.0
845 1 /usr/bin/python3 /usr/bin/n 0.8 0.0
851 1 /usr/sbin/NetworkManager -- 0.8 0.0
300 1 /lib/systemd/systemd-journa 0.7 0.0
1501 1 /usr/lib/packagekit/package 0.6 0.0
996 1 /usr/bin/whoopsie -f 0.6 0.0
3530 1 /usr/sbin/cups-browsed 0.5 0.0
855 1 /usr/sbin/ModemManager --fi 0.4 0.0
我正在学习数组,所以我的想法是创建一个数组来显示相同的输出:
ARRAY= (cat /tmp/freememory.txt)
echo ${ARRAY[@]}
但输出难以阅读
PID PPID CMD %MEM %CPU 859 1 /usr/lib/snapd/snapd 1.3 0.0 890 1 /usr/bin/python3 /usr/share 0.9 0.0 845 1 /usr/bin/python3 /usr/bin/n 0.8 0.0 851 1 /usr/sbin/NetworkManager -- 0.8 0.0 300 1 /lib/systemd/systemd-journa 0.7 0.0 1501 1 /usr/lib/packagekit/package 0.6 0.0 996 1 /usr/bin/whoopsie -f 0.6 0.0 3530 1 /usr/sbin/cups-browsed 0.5 0.0 855 1 /usr/sbin/ModemManager --fi 0.4 0.0
有没有办法使数组输出看起来像来自(cat“/tmp/freememory.txt”)的第一个输出?
谢谢
答案1
bash shell 只支持一维数组 - 如果你对数组感到满意线mapfile
使用(aka readarray
)内置函数非常简单:
$ mapfile -t array < freememory.txt
$ printf '%s\n' "${array[@]}"
PID PPID CMD %MEM %CPU
859 1 /usr/lib/snapd/snapd 1.3 0.0
890 1 /usr/bin/python3 /usr/share 0.9 0.0
845 1 /usr/bin/python3 /usr/bin/n 0.8 0.0
851 1 /usr/sbin/NetworkManager -- 0.8 0.0
300 1 /lib/systemd/systemd-journa 0.7 0.0
1501 1 /usr/lib/packagekit/package 0.6 0.0
996 1 /usr/bin/whoopsie -f 0.6 0.0
3530 1 /usr/sbin/cups-browsed 0.5 0.0
855 1 /usr/sbin/ModemManager --fi 0.4 0.0
注意双引号"${array[@]}"
可以防止单词拆分。如果愿意,你可以跳过文件并直接从 ps 管道读取数组,使用流程替代:
mapfile -t array < <(ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head)