次の行を含む 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進数の整数として解釈されます(これは他のシェルによってサポートされていますksh
)bash
。
どちらのバリエーションも、一部の出力を含むテキストファイルの存在に依存しません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