圧縮ファイルからテキストを検索し、ファイル名のみを取得する方法

圧縮ファイルからテキストを検索し、ファイル名のみを取得する方法

特定の文字列を含むファイル名のみを検索します。ファイルが圧縮されました(.gz)。

インストールができていないためzgrepインストールできません。したがって、そのオプションは使用できません-l

gzipandgunzipオプションを使用-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 $(...)、no case $x in (x)...)(Solaris 11はこれを実装するためにPOSIX互換シェルを使用します(ksh93)。/bin/sh)。
  • これらのシステムでは、以前のように圧縮されたファイルのみがzcat処理されます。ファイルを呼び出す必要があります。.Zcompressgzip.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

おすすめ記事