ファイルから行を読み取るときにbashスクリプトを使用して、指定された文字列と一致するものを見つけると、前の行を印刷する必要があります。

ファイルから行を読み取るときにbashスクリプトを使用して、指定された文字列と一致するものを見つけると、前の行を印刷する必要があります。

file.txt以下の内容を含むファイルがあり、10000行を超えています。

Wed May 27 15:41:29 PDT 2020  
Entering directory : /aaa/bbb/ccc  
Wed May 27 15:42:30 PDT 2020  
Entering directory : /aaa/bbb/ccc/ddd  
Wed May 27 15:43:19 PDT 2020  
Entering directory : /aaa/bbb/ccc/ddd/eee  
Wed May 27 15:44:25 PDT 2020  
Leaving directory : /aaa/bbb/ccc/ddd/eee  
Wed May 27 15:45:37 PDT 2020  
Leaving directory : /aaa/bbb/ccc/ddd'  
Wed May 27 15:46:42 PDT 2020  
Leaving directory : /aaa/bbb/ccc    

私は何をすべきですか?

ディレクトリに入る前に、タイムスタンプに基づいてどのディレクトリがどれくらいの時間を費やしたかを印刷する必要があります。

出力は次のようになります。

_Directory_ : `/aaa/bbb/ccc`  
_Time taken_ : `00:05:13`

このディレクトリのエントリー時間は次のとおりです。Wed May 27 15:41:29 PDT 2020出発時間は次のとおりです。Wed May 27 15:46:42 PDT 2020これにより視差が出力される。
同様に、他のインスタンスのディレクトリパスと時間差も印刷する必要があります。

フォーラムで検索して受け取るこれしかし、私の問題は完全に解決されていません。私はシェルスクリプトの専門家ではありませんが。したがって、誰かが私が出力を得るのを助けることができればいいでしょう。

ありがとう

ベストアンサー1

完全な答えではありませんが、sed文書を作成する場合

cat file.txt | sed -n 'N;l;D' | sed -n '/.*\/aaa\/bbb\/ccc\s*\$/p'

あなたは得るでしょう

Wed May 27 15:41:29 PDT 2020  \nEntering directory : /aaa/bbb/ccc  $
Wed May 27 15:46:42 PDT 2020  \nLeaving directory : /aaa/bbb/ccc$

これは、関連するすべてのディレクトリ(ループオーバーが必要)へのフルパスを知っている場合に問題を単純化します。

経過時間を取得するための日付算術は不明ですが、上記から日付を抽出できる場合は、Unix時間(1970年1月1日以降の秒)に変換するのが開始かもしれません。例えば

date -d "Wed May 27 15:41:29 PDT 2020" +%s

与えられた

1590619289

したがって、スクリプトで日付を変数に入れることができる場合(文字通り入力します)

ENTERDATE="Wed May 27 15:41:29 PDT 2020"
LEAVEDATE="Wed May 27 15:46:42 PDT 2020"

そしてそれをunixtimeに変換します。

ENTERSECONDS=`date -d "$ENTERDATE" +%s`
LEAVESECONDS=`date -d "$LEAVEDATE" +%s`

次のように持続時間を秒単位で取得できます。

DURATION=$(($LEAVESECONDS - $ENTERSECONDS))

この場合、

313

日付算術をよりよくサポートするパッケージがあるかもしれません。

お役に立てば幸いです。

おすすめ記事