文字列grepコマンドで変数を使用する方法

文字列grepコマンドで変数を使用する方法

というファイルに関連するさまざまな情報を提供する機能がありますCODESFILE-00001.DAT

関数内では、次のコマンドは正しく機能し、次を含む行を返します00202200USER

strings CODESFILE-00001.DAT | grep 00202200USER

CODESFILE-00001.DATしかし、スクリプト全体に変数を挿入するのではなく、1つの変数を使用して毎週バージョンを変更する.DATときは、スクリプトの7項目すべての代わりに変数を変更するだけです(検索と置換が優れていることを知っていますが)。変数でファイル名を設定することが可能な場合)

変数を次に設定したfilename=CODESFILE-00001.DAT後、次を試しましたが成功しませんでした。

strings $filename | grep 00202200USER 

strings “$filename” | grep 00202200USER

答え1

PATHディレクトリとchmod +xファイルに保存します。

#! /bin/sh -
: "${1?Syntax: $0 <file>}"
strings -- "$1" | grep '00202200USER'

より複雑なエラーチェックを生成したり、さまざまなモードのオプションを指定したりすることもできますが、grep本質的にそれはすべてです。

$1(および$0オプションの区切り文字)は、--堅牢性のために重要ですが、カール「タイピスト」引用符(質問201DのU + 201C、U +)ではなく、直線ASCII引用符(U + 0022)でなければなりません。

同様に、より長いスクリプトでは、以下を設定できます。

filename=${1-CODESFILE-00001.DAT}

CODESFILE-00001.DATスキャンするファイルのデフォルト名を指定しますが、ユーザーはコマンドラインに引数を追加してファイル名をオーバーライドできます。

grep出力で複数のモードを使用するには、strings次のように言うことができます。

strings -- "$filename" |
grep -e '00202200USER' \
     -e '1234SYSTEM' \
     -e '7890REAL'

これら3つの文字列を同時に検索(検索順に出力)したり、検索文字列で並べ替えたり、結果を後処理したい場合は、単純なAwkスクリプトでリファクタリングできます。おおよそのスケッチです。

strings -- "$filename" |
awk -v patterns='00202200USER;1234SYSTEM;7890REAL' '
   BEGIN { n=split(patterns, pat, ";") }
   { for(i=1; i<=n; ++i) if ($0 ~ pat[i]) hits[i] = hits[i] "\n\t" $0 }
   END { for(i=1; i<=n; ++i) print pat[i] hits[i] }' 

出力例:

00202200USER
    ick 00202200USER;1234SYSTEM;7890RE
1234SYSTEM
    ick 00202200USER;1234SYSTEM;7890RE
    foo 1234SYSTEM
7890REAL
    poo 7890REAL
    bah 7890REAL

(パターンが合わない場合はとにかく印刷されます。それを望まない場合は、修正がかなり明確になります。)

答え2

より簡単です。

#!/bin/sh
filename=CODESFILE-00001.DAT
pattern=00202200USER
grep $pattern $filename

ファイル名を最後の引数として使用できるため、必要はありません(使用することを恐れないstringsでください)。grepman grep

変数にスペースがないため、ここでは引用符は必要ありません。しかし、そうです。以下を引用することもできます。

grep "$pattern" "$filename"

関連情報