recursive unix grep set

unix - recursive - ls grep



Unix comando para encontrar cadenas de intersecciones o valores atípicos? (6)

¿Hay un comando de UNIX a la par con

sort | uniq

para buscar cadenas de intersecciones o "valores atípicos".

Una aplicación de ejemplo: tengo una lista de plantillas html, algunas de ellas tienen la cadena {% load i18n%} dentro, otras no. Quiero saber qué archivos no lo hacen.

edit: grep -L resuelve el problema anterior.

Qué tal esto:

archivo1:

mom dad bob

archivo2:

dad

% intersect file1 file2

dad

% left-unique file1 file2

mom bob


De http://www.commandlinefu.com/commands/view/5710/intersection-between-two-files :

Intersección entre dos archivos (sin clasificar):

grep -Fx -f file1 file2

Líneas en el archivo 2 que no están en el archivo 1:

grep -Fxv -f file1 file2

Explicación:

  • La opción -f le dice a grep que lea los patrones para buscar desde un archivo. Eso significa que realiza una búsqueda de archivo2 para cada línea en archivo1.
  • La opción -F le dice a grep que vea los términos de búsqueda como cadenas fijas, y no como patrones, de modo que ac solo coincida con ac y no abc ,
  • La opción -x le dice a grep que realice búsquedas de línea completa, de modo que "foo" en file1 no coincida con "foobar" en file2.
  • De forma predeterminada, grep mostrará solo las líneas coincidentes, lo que le dará la intersección. La opción -v le dice a grep que solo muestre líneas no coincidentes , dándole las líneas que son únicas para file2.

Intersecarse:

# sort file1 file2 | uniq -d dad

Izquierda única:

# sort file1 file2 | uniq -u bob mom


Intersección:

comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

Todas las líneas por 3 columnas (archivo1 | archivo2 | intersección):

comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

Si sus archivos no están ordenados y / o si puede haber líneas duplicadas dentro de uno de los archivos pero no aparecen en el otro, este comando de una línea ordenará sus archivos, eliminará las líneas duplicadas y Obtén directamente el resultado deseado.


Parece que grep -L resuelve el problema real del póster, pero para la pregunta real formulada, al encontrar la intersección de dos conjuntos de cadenas, es posible que desee ver el comando "comm". Por ejemplo, si file1 y file2 contienen una lista ordenada de palabras, una palabra por línea, entonces

$ comm -12 file1 file2

Producirá las palabras comunes a ambos archivos. Más generalmente, dados los archivos de entrada ordenados file1 y file2 , el comando

$ comm file1 file2

Produce tres columnas de salida.

  1. líneas solo en archivo1
  2. líneas solo en archivo2
  3. líneas tanto en archivo1 como en archivo2

Puede suprimir la columna N en la salida con la opción -N . Entonces, el comando anterior, comm -12 file1 file2 , suprime las columnas 1 y 2, dejando solo las palabras comunes a ambos archivos.


Tal vez no entiendo bien la pregunta, pero ¿por qué no usar grep para buscar la cadena (use la opción -L para que imprima los nombres de los archivos que no tienen la cadena)?

En otras palabras

grep -L "{% load i18n %}" file1 file2 file3 ... etc

o con comodines para los nombres de archivo según corresponda.


de man grep

-L, --files-without-match

Suprimir la salida normal; en su lugar, imprima el nombre de cada archivo de entrada del que normalmente no se habría impreso ninguna salida. El escaneo se detendrá en el primer partido.

Así que si tus plantillas son archivos .html que deseas:

grep -L ''{% load i18n %}'' *.html