Grep
如何在壓縮文件中搜尋文本並僅獲取文件名
我試圖找到包含特定字元串的文件名。文件被壓縮 (
.gz
)。我沒有
zgrep
安裝也無法安裝。因此我不能使用該-l
選項。我已經嘗試使用and
gzip
選項和 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 而不是標準的 POSIXsh
。你可以選擇改變你的 she-bang 來#! /usr/xpg4/bin/sh -
獲得一個標準sh
,或者像我們在這裡做的那樣限制自己使用古老的 Bourne 語法(所以 no$(...)
, nocase $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