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 queac
solo coincida conac
y noabc
, - 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.
- líneas solo en archivo1
- líneas solo en archivo2
- 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