awkはパラメータの上のすべての行と一致します。

awkはパラメータの上のすべての行と一致します。

次の行を含む test.out というファイルがあります。

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z
-rw-rw----    1 informix informix   10832325 Jan 21 06:39 shop4_0_Log0000331881.Z
-rw-rw----    1 informix informix    8521443 Jan 21 07:42 shop4_0_Log0000331882.Z
-rw-rw----    1 informix informix   10283566 Jan 21 08:02 shop4_0_Log0000331883.Z
-rw-rw----    1 informix informix   10633957 Jan 21 08:51 shop4_0_Log0000331884.Z

grep value 331881パラメータ上記のすべての行を印刷したいです。

私が望む結果は次のようになります。

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z

次のコマンドを使用すると、印刷する行数を指定できます。

grep -n 331881 test.out | cut -d':' -f1 |  xargs  -n1 -I % awk "NR<=%+0 && NR>=%-1" test.out | sed '$d'

上記のコマンドは指定された行数(この場合は1行)だけを印刷しますが、grep行の上のすべての内容を印刷するように上記のコマンドを変更したいと思います。私は私の問題に対する解決策や簡単な方法を見つけようとしています。

答え1

リストされたファイルが含まれているディレクトリーにあるとし、以下を使用しますzsh

ls -ld shop4_0_Log<331882->.Z

331882以上の整数に一致する特定のglob <331882->zsh

別のシェルを使用してください。

for name in shop4_0_Log*.Z; do
    number=${name#shop4_0_Log}
    number=${number%.Z}

    if [ "$number" -ge 331882 ]; then
        ls -ld "$name"
    fi
done

shop4_0_Logここではで始まり、終わる名前を繰り返します.Z。これらの名前ごとにファイル名の整数部分を選択し、331882以上の場合はls -ldその名前を呼び出します。

先行ゼロのためにシェルが特定の数字を8進数として解釈すると(私のテストではそうではありません)、10#$numberテストで使用すると、数字は10進数の整数として解釈されます(これは他のシェルによってサポートされていますkshbash

どちらのバリエーションも、一部の出力を含むテキストファイルの存在に依存しませんls

関連:

答え2

awkを直接使えると思います。

awk '/331881/ { exit } 1' test.out

これですべての行が印刷されますが、一致する行は331881終了します。

答え3

もう一つの良いツールは次のとおりですsed

sed -n '/shop4_0_Log0000331881\.Z$/q;p' test.out

答え4

j=`awk '/331881/{print NR}' file`

awk -v j="$j" '{a[++i]=$0}/331881/{for(x=NR-j;x<NR;x++)print a[x]}' file

出力

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z

関連情報