Musím grepnout některé soubory, abych zjistil, které obsahují určité slovo:
grep -l word *
Dále potřebuji grepovat seznam souborů, abych zjistil, které obsahují jiné slovo. Snadný způsob by byl pravděpodobně napsat skript, ale nevím, jak jej správně zpracovat.
Komentáře
Odpověď
Za předpokladu, že žádný z názvů souborů neobsahuje mezery, jednoduchá citace, uvozovky nebo znaky zpětného lomítka (nebo začínající na – s GNU grep
), můžete:
grep -l word * | xargs grep word2
Xargs spustí druhý grep nad každým souborem z prvního grepu.
S GNU grep
/ xargs
nebo kompatibilní, můžete jej zvýšit spolehlivostí pomocí:
grep -lZ word ./* | xargs -r0 grep word2
Pomocí -Z
je grep
vytiskne názvy souborů s oddělením NUL, aby jej bylo možné použít s xargs -0
. Možnost -r
k xargs
zabrání spuštění druhého grep
, pokud první grep
nic nenajde.
Odpověď
grep -l word1 $(grep -l word2 *)
nebo možná pro jedno ze dvou slov na stejném řádku:
grep -w "word1\|word2" *
viz zde
Odpovědět
Pokud potřebujete najít soubory obsahující slovo a poté odfiltrovat soubory obsahující jiné slovo, můžete použít posloupnost těchto příkazů:
grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2
-
grep word *
– zobrazí všechny soubory obsahující slovo „word“, název souboru bude první v seznamu. -
awk -F ":" "{print $1}"
– vytiskne pouze název vašich výsledků -
uniq
– zajistí, že nevytisknete název souboru více než jednou. -
xargs grep word2
– znovu vyhledá v seznamu souborů, které jste dostali.
Komentáře
- @don_crissti Ale kombinace kousků
grep -l word1 * | xargs -d'\n' grep -l word2
funguje na cokoli kromě nového řádku, což je dost divné, skoro nikdo ho nepoužívá.
grep
? GNUgrep
? Používáte BSD v systému Linux, Solaris?