【问题标题】:Error displaying info with an script使用脚本显示信息时出错
【发布时间】:2016-09-28 20:59:43
【问题描述】:

我需要使用 bash 脚本通过终端显示某些信息。 我需要显示的信息是 UID、PID、PPID、STATUS、CMD。 好的,所以我已经这样做了,但是我在识别和印刷方面存在某些问题。 我需要这样显示:

UID     PID     PPID     STATUS    CMD
root     1       0      Sleeping    /sbin/init

但是用我的代码我得到了这个:

UID     PID     PPID     STATUS    CMD
root     
1       0      (sleeping)    /sbin/init

这实际上是我的代码:

echo "UID   PID  PPID    STATUS             CMD"

for i in /proc/*; do
getent passwd `cat $i/status|grep "^Uid"`| cut -d: -f1|head -1
cat $i/status|grep "^Pid"|awk '{printf "%-9s",$2}'
cat $i/status|grep "^PPid"|awk '{printf "%-9s",$2}'
cat $i/status|grep "^State"|awk '{printf"%-9s",$3}'
cat $i/cmdline|awk '{printf "      %-25s",$1}'
echo '\n'
done

使用此代码,我还会收到很多“不是目录”错误。 我是新手,所以我需要大量帮助:( 注意:我不能使用 ps 命令

【问题讨论】:

  • 检查man ps...
  • 作为限制,我不能使用 -ps
  • @RodrigoAlejandroMuozInostro 为什么会有这么奇怪的要求?
  • 因为我需要用我的代码创建一个 ps 命令
  • 所以,你应该学习C编程语言

标签: linux bash ubuntu terminal sh


【解决方案1】:

命令 ps(检查 man ps)可以自己完成所有这些操作:

$ ps -eo user,pid,ppid,state,cmd  | head -n 10

【讨论】:

    【解决方案2】:

    唯一的问题是head 输出一个完整的行,但你想抑制换行。通过捕获输出并使用printf 显示它来做到这一点。

    下面还清理了无用 catgrep 的更令人震惊的用法,但可以进一步简化。

    echo "UID   PID  PPID    STATUS             CMD"
    
    for i in /proc/*; do
      uid=$(getent passwd $(grep "^Uid" "$i/status") | cut -d: -f1 | head -1)
      printf '%-9s' "$uid"   # May need to adjust the formatting
      awk '/^Pid/ {printf "%-9s",$2}' "$i/status"
      awk '/^PPid/ {printf "%-9s",$2}' "$i/status"
      awk '/^State/ {printf"%-9s",$3}' "$i/status"
      awk '{printf "      %-25s\n",$1}' "$i/cmdline"
    done
    

    【讨论】:

      【解决方案3】:

      如果你想玩 shell,请先阅读文档:

      然后显示你需要的东西,而不会有任何混乱:

      ps -c -o 'uid pid ppid status ucmd' 
      

      【讨论】:

      • 作为限制我不能使用ps
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多