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

  • Which grep? GNU grep? Používáte BSD v systému Linux, Solaris?
  • I ' m pomocí Linuxu.

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á.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *