ファイルリストで単語リストを見つける必要があります。そのため、単語リストをファイルに入れ、for
ループを使用してファイル内の各単語を読み込み、findコマンドを使用して見つかったgrep
ファイルのリストでその単語を見つけました。
上記のLinuxバージョンを使用しています。
bash-3.1$ uname
HP-UX
以下に記載されているのは私のシェルスクリプトです。
#!/bin/sh
PATH="/NO/20171013"
STRING=`/usr/bin/cat /home/test/STAT44_test.txt`
for LINE in ${STRING}
do
echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l"
LINES=`find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l`
echo "LINES count is ${LINES}"
if [ ${LINES} -eq 0 ]
then
echo "In not found"
# echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out
else
echo "In Found"
# echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out
fi
done
findコマンドはfind ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null
コマンドプロンプトで完全に機能しますが、上記のようにシェルスクリプトで使用すると出力は提供されません。
出力echo $?
は0ですが、findコマンドは出力を生成しません。
スクリプトの出力は次のとおりです。
find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
実際、*.txt
以下のファイルには/NO/20171013
パターン655044810645
と734729751028
が含まれているのでWord count
、ゼロではなく、そのelse
セクションに入る必要があります。
何が欠けている可能性がありますか?
答え1
$PATH
はい意味のある重要な変数。別の名前を選択する必要があります。
この場合、原因がないfind
ため実行可能ファイルが見つかりません。$PATH
そのため、通知が届きませんでした2>/dev/null
。
echo
$PATH
おそらくシェルが組み込まれているので、動作する必要はありません。for
待つのも同じだ。
答え2
最初、適切なものを設定し$PATH
(回答を確認してください)カミール・マコロフスキー):
適切なユーザー(root?)でログインし、次を実行します。
echo PATH=$PATH
スクリプトの先頭に出力を追加する
またはコマンドのフルパスを追加できますfind
。find
どこに配置するのかわからない場合は、次の手順を実行してください。
which find
出力は次のとおりです。/usr/bin/find
ループ内にエラーがあります:
一重引用符を二重引用符(囲み)に置き換える必要があります${LINE}
。それ以外の場合、変数は解釈されません。
echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l"
LINES=`find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l`
いくつかの注意:
- その必要はありません
cat file
。代わりにループを試してください。しかし、使用while
できませんfor
!「for」のある行を読まない理由を読んでください。そしてファイル(データストリーム、変数)を1行ずつ(および/またはフィールドごとに)読み取る方法は?