Grep

如何在壓縮文件中搜尋文本並僅獲取文件名

  • November 2, 2015

我試圖找到包含特定字元串的文件名。文件被壓縮 ( .gz)。

我沒有zgrep安裝也無法安裝。因此我不能使用該-l選項。

我已經嘗試使用andgzip選項和 pipping to但沒有奏效,我也使用過但也沒有奏效。有什麼線索嗎?gunzip``-c``grep -l``zcat

(注意:作業系統是 Solaris 10)。

您可以手動完成 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是 Bourne shell 而不是標準的 POSIX sh。你可以選擇改變你的 she-bang 來#! /usr/xpg4/bin/sh -獲得一個標準sh,或者像我們在這裡做的那樣限制自己使用古老的 Bourne 語法(所以 no $(...), no case $x in (x)...​​)(Solaris 11 現在使用符合 POSIX 的 shell 作為它的/bin/sh( ksh93))。
  • 在這些系統上,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

引用自:https://unix.stackexchange.com/questions/237726