grepを使用して検索を実行すると、一致するものが見つかったときに、ファイル名とそのファイルの最初のn文字が出力されます。これn
は指定可能なパラメータであり、最初のn文字に実際に一致する文字列が含まれているかどうかは関係ありません。
4 に答える
grep -l pattern *.txt |
while read line; do
echo -n "$line: ";
head -c $n "$line";
echo;
done
バイトではなく最初の行を表示する場合は、に変更-c
します。-n
n
目的を達成するには、grepの出力をsedにパイプする必要があります。次に例を示します。
grep mypattern *.txt | sed 's/^\([^:]*:.......\).*/\1/'
ドット数は、印刷する文字数です。sedの多くのバージョンには、-r(GNU / Linux)や-E(FreeBSD)など、最新の正規表現を使用できるオプションが用意されていることがよくあります。これにより、印刷する文字数を数値で指定することができます。
N=7
grep mypattern *.txt /dev/null | sed -r "s/^([^:]*:.{$N}).*/\1/"
このソリューションは、複数のプロセスを呼び出す他のソリューションよりもはるかに効率的であることに注意してください。
「n 行」ではなく「n 文字」を印刷するツールはほとんどありません。本当に線ではなく文字が必要ですか? 全体は、おそらく Perl で行うのが最適です。指定したとおり ( を使用grep
)、次のことができます。
pattern="$1"
shift
n="$2"
shift
grep -l "$pattern" "$@" |
while read file
do
echo "$file:" $(dd if="$file" count=${n}c)
done
前後の引用符は$file
、ファイル名の複数のスペースを正しく保持します。現在、コマンド ラインの使用法について議論することができます (コマンド名が ' ngrep
' であると仮定します)。
ngrep pattern n [file ...]
@litb が ' head -c $n
';を使用していることに注意してください。dd
これは、私が使用したコマンドよりも優れています。ないシステムもあるかもしれませんhead
(しかし、それらはかなり古風です)。の POSIX バージョンはと行数head
のみをサポートしていることに注意してください。オプションはおそらく GNU 拡張です-n
。-c
ここで2つの考え:
1) 効率が問題にならない場合 (そのようなことはありません)、各ファイルでgrepを実行した後に$status [csh] を確認できます。例: ( N文字= 25の場合)
foreach FILE ( file1 file2 ... fileN )
grep targetToMatch ${FILE} > /dev/null
if ( $status == 0 ) then
echo -n "${FILE}: "
head -c25 ${FILE}
endif
end
2) GNU [FSF]ヘッドには--verbose [-v]スイッチが含まれています。また、スペースを含むファイル名に対応する--nullも提供します。そして、 「- c」のようなファイル名を処理する「--」があります。したがって、次のことができます。
grep --null -l targetToMatch -- file1 file2 ... fileN |
xargs --null head -v -c25 --