特定の文字列を含むファイル名のみを検索します。ファイルが圧縮されました(.gz
)。
インストールができていないためzgrep
インストールできません。したがって、そのオプションは使用できません-l
。
gzip
andgunzip
オプションを使用-c
して pipping しようとしましたが、grep -l
動作しません。また、ピッピングを試してみましたが、zcat
それも機能しません。どんな手がかりがありますか?
(注:オペレーティングシステムはSolaris 10です。)
ベストアンサー1
zgrep操作を手動で実行できます。ファイル名だけが必要なので、パターンがgrep
あるかどうかをテストし、パターンが見つかったらファイル名を印刷するためのものです。
#!/bin/sh
pattern=$1; shift
PATH=`getconf PATH`:$PATH # needed on Solaris 10 and earlier
# to get a standard grep
export PATH
found=0
for x do
if case "$x" in
*.gz|*.[zZ]) <"$x" gzip -dc | grep -q -e "$pattern";;
*) <"$x" grep -q -e "$pattern";;
esac
then
found=1
printf '%s\n' "$x"
fi
done
if [ $found -eq 0 ]; then exit 1; fi
動作モードは次のとおりです。
that-script 'pattern' file1 file2.gz file3.Z file.*.gz ...
Solaris 10を実行するためのいくつかの特定のガイドライン(以前のバージョンおよびある程度Solaris 11にも適用可能)
- これらのシステムでは、
/bin/sh
標準のPOSIXの代わりにBourneシェルが使用されますsh
。#! /usr/xpg4/bin/sh -
標準を得るためにshe-bangを変更するsh
か、ここで述べたように古代のBourne構文に制限することができます(それでno$(...)
、nocase $x in (x)...
)(Solaris 11はこれを実装するためにPOSIX互換シェルを使用します(ksh93)。/bin/sh
)。 - これらのシステムでは、以前のように圧縮されたファイルのみが
zcat
処理されます。ファイルを呼び出す必要があります。.Z
compress
gzip
.gz
- デフォルトでは、標準ユーティリティを必ずしも得ることはできません。たとえば、デフォルトは古代
grep
オプション/usr/bin
であり、標準オプションをサポートしていません-q
。標準ユーティリティを取得するには、$PATH
標準ユーティリティを含むパス(出力など)を更新する必要がありますgetconf PATH
。
アーカイブメンバー名と行番号または内容を表示するには、grepから行データをインポートし、スクリプトからメンバー名を取得する必要があります。呼び出しから-q
オプションを削除grep
し、その内容を後処理します。
#!/bin/ksh
pattern=$1; shift
export PATH="$(getconf PATH):$PATH" # needed on Solaris 10 and earlier
# to get a standard grep
found=0
for x do
case "$x" in
*.gz|*.[zZ]) <"$x" gzip -dc | grep -n -e "$pattern";;
*) <"$x" grep -n -e "$pattern";;
esac | {
filename=$x awk '{print ENVIRON["filename"] ":" $0; found=1}
END {exit(!found)}' && found=1
}
done
if [ $found -eq 0 ]; then exit 1; fi