0

シェルスクリプトを使用して top コマンドの最初の 5 行を取得しようとしています。これが私のシェルスクリプトの出力です。

PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND
3983,arun,20,0,1874616,500356,24132,R,47.6,10.3,53:19.92,gnome-shell
11,root,20,0,0,0,0,R,4.8,0.0,0:22.51,rcuos/0
2016,root,20,0,219396,44408,9120,S,4.8,0.9,9:53.96,Xorg
12081,arun,20,0,2689552,304132,7076,S,4.8,6.3,13:36.17,java
1,root,20,0,141660,5336,2940,S,0.0,0.1,0:08.40,systemd
3983,arun,20,0,1874616,500356,24132,R,56.2,10.3,53:20.99,gnome-shell
2016,root,20,0,219396,44408,9120,R,18.8,0.9,9:54.17,Xorg
4969,arun,20,0,1287084,162948,48472,S,12.5,3.4,5:39.99,chrome
16108,arun,20,0,130020,1692,1172,R,6.2,0.0,0:00.01,top
1,root,20,0,141660,5336,2940,S,0.0,0.1,0:08.40,systemd
3983,arun,20,0,1874616,500356,24132,R,43.8,10.3,53:24.56,gnome-shell
4969,arun,20,0,1275992,147104,32424,S,37.5,3.0,5:41.10,chrome
1,root,20,0,141660,5336,2940,S,0.0,0.1,0:08.40,systemd
2,root,20,0,0,0,0,S,0.0,0.0,0:00.06,kthreadd
3,root,20,0,0,0,0,S,0.0,0.0,0:04.93,ksoftirqd/0

ここに私のシェルスクリプトtop.shがあります

 #!/bin/bash
echo "started.."
top -b -n 3 | sed -n '7,1{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt

while [ true ]; do
  sleep 5
  echo "inside loop.."
  top -b -n 3 | sed -n '8,12{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt
done

ここで、各行の終わりにタイムスタンプを追加する必要があります。コマンドを使用して同じことを試みましたが、うまくいきawkませんでした。私はこのように私のコードを編集しました -

#!/bin/bash
    echo "started.."
    t= =$(date +"%T")

    top -b -n 3 | sed -n '7,1{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt
    awk -F, '{$(NF+1)="TIME";}1' OFS=, out.txt    

    while [ true ]; do
      sleep 5
      t=$(date +"%T")
      echo "inside loop.."
      top -b -n 3 | sed -n '8,12{s/^ *//;s/ *$//;s/  */,/gp;};12q' >> out.txt
      awk -F, '{$(NF+1)=$t;}1' OFS=, file
    done
4

2 に答える 2

1

Awk コマンドは、ファイル全体 (または 2 番目のインスタンスでは無関係または存在しないファイル全体) に対して実行され、標準出力に出力されます。入力ファイルを上書きするようにコマンドを修正すると、タイムスタンプが既にある行にタイムスタンプが追加されます。とにかく、ファイル全体にさらに日付スタンプを追加するのではなく、新しいデータをファイルに追加するコマンドへの日付スタンプの追加をインライン化する必要があります。

sedスクリプトはすでに多くの置換を実行しています。タイムスタンプも考慮に入れるのは簡単です。シェルが変数の値を展開するには、一重引用符ではなく二重引用符を使用する必要があります。

#!/bin/bash

t=$(date +"%T")   #### Syntax error fixed
top -b -n 3 |
sed -n -e '7!b;s/^ *//' -e "s/ *$/,$t/" -e 's/  */,/gp;q' >> out.txt
#### ^sed script refactored; only work on line 7, not until 12

while true; do   #### Wacky syntax fixed
  sleep 5
  t=$(date +"%T")
  top -b -n 3 |
  sed -n -e '8,12{s/^ *//' -e "s/ *$/,$t/" -e 's/  */,/gp;};12q' >> out.txt
done
于 2016-01-28T06:05:38.947 に答える
0

この行で:

awk -F, '{$(NF+1)=$t;}1' OFS=, file

一重引用符で囲まれたシェル変数を使用している$tため、展開されません。次の構文を使用して、-vシェル変数を awk に渡します。

awk -F, -v OFS=, -v t="$t" '{$(NF+1)=t;}1'  file
于 2016-01-28T05:54:27.547 に答える