というファイルに関連するさまざまな情報を提供する機能があります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
でください)。grep
man grep
変数にスペースがないため、ここでは引用符は必要ありません。しかし、そうです。以下を引用することもできます。
grep "$pattern" "$filename"