Bash脚本变量输出不起作用

时间:2014-05-22 21:36:16

标签: linux bash echo sh

我有一个bash脚本,它解析包含有关服务器上运行的进程的信息的文件。除输出外,一切都有效。

目标输出
tomcat7 Running Monitored 3025 18d 2h 16m 3.6% 0.0%

实际输出的是什么
0.0%2h 16m ing

脚本部分进行解析和输出

for SERVER in $SERVERS ; do
    SYSTEM=$(sed -n '/System/{p; n;p; n;p; n;p; n;p; n;p}' $H_DIR/$SERVER.txt)
    sed -n '/Process/{p; n;p; n;p; n;p; n; n;p; n;n;n; n;p; n; n;p}' $H_DIR/$SERVER.txt > $H_DIR/procs.txt
    split --lines=7 $H_DIR/procs.txt $H_DIR/procs.txt.
    for PROC in $H_DIR/procs.txt.?? ; do
        PROCESS=$(cat $PROC | head -1 | tail -1 | cut -d "'" -f2)
        STATUS=$(cat $PROC | head -2 | tail -1 | awk '{ print $NF }')
        MONITOR=$(cat $PROC | head -3 | tail -1 | awk '{ print $NF }')
        PID=$(cat $PROC | head -4 | tail -1 | awk '{ print $NF }')
        UPTIME=$(cat $PROC | head -5 | tail -1 | awk '{ print substr($0, index($0, $2)) }')
        PCPU=$(cat $PROC | head -6 | tail -1 | awk '{ print $NF }')
        PMEM=$(cat $PROC | head -7 | tail -1 | awk '{ print $NF }')
        echo $PROCESS $STATUS $MONITOR $PID $UPTIME $PCPU $PMEM
    done
    rm -f $H_DIR/procs.*
    rm -f $H_DIR/$SERVER.txt
done

正在解析的原始文件

Process 'tomcat7'
  status                            Running
  monitoring status                 Monitored
  pid                               3025
  uptime                            18d 2h 30m
  memory percent                    3.6%
  cpu percent                       0.0%

1 个答案:

答案 0 :(得分:2)

预感 - 您的输入文件具有DOS回车换行组合。

我将其添加到您的文件中并获得了相同的结果。

有关如何删除回车的信息,请参阅此问题:

Remove carriage return in Unix

使用建议的tr -d '\r'方法删除回车符(并且可能同时删除单引号),您可以执行以下操作:

echo $(tr -d "\r\'" < $PROC | awk 'NR==5{print substr($0,index($0,$2))}{print $NF}')

或者如果您需要分配的每个变量,那么

VARS=$(tr -d "\r\'" < $PROC | awk 'NR==5{print substr($0,index($0,$2))}{print $NF}')
read PROCESS STATUS MONITOR PID UPTIME PCPU PMEM <<<$VARS
echo $PROCESS $STATUS $MONITOR $PID $UPTIME $PCPU $PMEM

无论哪种方式,输出都是

tomcat7 Running Monitored 3025 18d 2h 30m 30m 3.6% 0.0%