3

これはSEDの問題です。

Quartz Composer(Mac OSX)スクリプトで次の作業を行っています。

  1. ディレクトリから最後の.logを開きます。
  2. そのファイルの最後のテキスト行を取得し、その最初の24文字を削除します。
  3. 最後の.log内に新しい行が作成されるたびに、最後の行を表示します

これはとても簡単だと思います。現時点では、これをQCで行っており、ほぼ機能しています。しかし、 getFileName.shgetLastLineOfLog.shの両方のSEDコマンドに問題があります

getFileName.sh

#!/bin/bash

cd /Users/Me/
/bin/echo `ls -tr *.log | tail -1`

ここで必要なのは、最後の.logファイルを開くことです。この名前構造は127.0.0.1、NUMBER.logで、NUMBERセクションは5桁の数字です。数値が大きいほど、.logファイルは新しくなります。これで、最初の.logファイルだけが開きます。

それを行うための正しいコマンドをSEDに書き込む方法を知っていますか?

getLastLineOfLog.sh

#!/bin/bash

/usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' > /Users/Me/$1.log
echo `/usr/bin/tail -1 /Users/Me/$1.log`

この2番目のファイルでは、ロードされた.logの最後のファイルを取得し、最初の24文字なしでエコーしようとしました。動作しますが、新しい.log.logを作成します。(など)関数が通過するたびにファイルする、避けたいこと。

SEDコマンドの結果を新しいファイルに出力する必要がありますか?どうすればそれをできるだけ簡単に行うことができますか?

前もって感謝します。

4

3 に答える 3

2

ファイル名で並べ替える場合:

ls *.log | sort -t, -k2 -n | tail -1
于 2010-11-09T20:43:46.990 に答える
1

getFileName.sh

#!/bin/bash

cd /Users/Me/
ls -tr *.log | tail -1

引数echoを出力するので、は必要ありません。echo

getLastLineOfLog.sh

#!/bin/bash

/usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' 

同様に、ここでは、すでに最後の行だけがあるので、別の行は必要ありませんtail

編集:実際、sedで実行することで、テールを取り除くこともできます:

getLastLineOfLog.sh

#!/bin/bash

sed -ne'$s/^.\{24\}//p' /Users/Me/$1
于 2010-11-09T11:34:26.653 に答える
1

非常に古い質問であることは知っていますが、最後のファイルをbashのみの方法で、パイプなしで取得する2つの方法があります。

  • 最初の方法:

    : * && echo $_
    

    man bash言う:

    $_展開後、前のコマンドの最後の引数に展開します。

    したがって、ここでは:、すべてのファイルを引数としてコマンドを実行し(何もしません)、最後のファイルを。で取得しています$_

  • 2番目の方法:

    for lastfile in *; do : ; done
    echo "$lastfile"
    

    このように、各ファイルを割り当てる以外に何もしていません。lastfile最後に、最後のファイル(アルファベット順)がに保存されlastfileます。

于 2015-09-19T22:49:43.077 に答える