jueves, 20 de octubre de 2016

Otra Guia mas de grep

bueno, no quiero reinventar el fuego: esta guia la he escrito para mi mismo aunque si a alguien le sirve me agradará saberlo!

Grep es un comando Unix que sirve para buscar cadenas de texto en archivos.

basicamente funciona así:

grep cadenaabuscar archivoendondesebusca

si la cadena es larga y contiene espacios se puede usar ' ':

grep 'cadena a buscar' archivoendondebusca

si queremos que grep nos diga solo las linias que empiezan con una cadena:

grep '^cadena con la que debe iniciar la linia' archivo.txt

si queremos que a grep no le importen las mayusculas o las minusculas usamos -i

grep -i CadenAaBuscar archivo.txt

si queremos que grep busque una palabra en cualquier lugar de la linea usamos $

grep 'palabra$' archivo.txt

se diferencia de

grep 'palabra' archivo.txt  --> en que este segundo comando buscará la palabra aunque este metida en otra palabra asi: parangacutitidimicuaropalabraparangacutitidimicuaro

si queremos que grep nos ensene las liniea donde NO ESTA una cadena usaremos -vi

grep -vi 'cadenaquenoquiero' archivo.txt

tambien podemos decirle a grep que busque en un grupo de archivos cuyo nombre empieza con asi "arch" por ejemplo, asi:

grep 'buscaesto" arch*

y el nos dara un resultado diciendo donde lo encontro y que:

archivo1.txt:buscaestoaqui
archivo2.txt:buscaestoalla

y si solo queremos que grep nos diga en que archivo esta podemos usar -l (list) que ademas podemos combinar con las otras y hacer un -vil

grep -l '3' arch*
archivo1.txt
archivo2.txt

podemos tambien decirle a grep que nos ensene una linea antes o despues de la liniea encontrada con grep -C cuantaslinias -i "cadena" archivo.txt
... cuantaslinias
liniadearriba
cadena
liniadeabajo
... cuantaslinias

claro, con numeros:
grep -C 2 -i "cadena" archivo.txt 

ah, apropósito tambien sirven las comillas dobles "" en lugar de simples ''

tambien podemos decirle a grep que consiga las lineas que contienen caracteres entre una secuencia, como desde el 0 al 5 asi:

grep [0-5] archivo.txt
linea con un 2
linea con un 4
1 linea
3 linea

la linia con un 6 no saldrá

si solo queremos que grep encuentre las lineas que comienzan con estos numeros usamos ^

grep [^0-5] archivo.txt
1 linea
3 linea

 y las otras dos que no comienzan con los numeros de las secuencia buscada no saldran

grep tambien se entiende bien con directorios, asi si estamos en un directorio que contiene otro llamado "carpeta" podemos decirle a grep

grep 'cadena' carpeta/*

y si queremos una busqueda recursiva (que incluya subcarpetas) podemos usar -r

grep -r cadena carpeta/*

la opcion -n nos permitira ver el numero de línia donde esta la cadena

~\> grep -n [0-3] test.txt
2:testing 1
3:Testing 2
4:TesT 3


Uno muy útil, mostrar el contenido de un fichero omitiendo las linieas comentadas. Por ejemplo para apache.conf etc:

grep -v ^# autofs.conf 

quitar las lineas vacias:

grep .  archivo.txt

y quitar las linias comentadas y las vacias:


grep -v ^# archivo.txt | grep . 

comparar dos ficheros: mejor que grep en este caso te recomiendo sdiff (super-diferencias, en realidad sidebysidediff) que te muestra los resultados ordenadamente en una tablita...

sdiff archivo1.txt archivo2.txt

aparte de sdiff tambien existe un diff, un poco mas primitivo que el primero, aunque en algunos casos podria ser útil, la sintaxis es la misma



Aqui una tablita util de opciones de grep:

Option Beschreibung
-r Setze die Suche rekursiv durch alle Unterverzeichnisse fort. Funktioniert nur bei
der Verwendung von Wildcards einwandfrei
-c Anzeige der Anzahl Zeilen, in denen das Muster gefunden wurde
-i Groß- und Kleinschreibung werden nicht unterschieden
-l Nur Anzeige der Namen der Dateien, in denen das Muster gefunden wurde
-n Zeigt die Zeilennummer an, in der das Muster gefunden wurde
-s Unterdrückt die Fehlerausgaben (Standardfehler); sinnvoll in Skripten
-v Zeigt alle Zeilen an, die das Muster nicht enthalten
-w Das Suchmuster muss ein einzelnes Wort sein (also kein Bestandteil eines anderen Wortes)
-A [n] Zeigt »n« Zeilen an, die der Zeile mit dem Muster folgen
-B [n] Zeigt »n« Zeilen an, die vor der Zeile mit dem Muster liegen
--color=auto Hebt das gesuchte Muster farblich hervor

esta tablita me la tome de:
http://www.prontosystems.org/tux/grep

Crear una script condicional usando grep:

#!/bin/bash
# Script que comprueba la existencia de un Driver
# en conjuncion con Munki se puede usar para instalar el mismo si no esta
if kextstat | grep -q "com.asix.driver.ax88179-178a";
then
    # Driver vorhanden
    touch /Users/Shared/found_kesing_driv.txt
    exit 1
else
    # Driver existiert NIX
    touch /Users/Shared/NOT-found_kesing_driv.txt
    exit 0
fi


 si deseamos que el script funcione a la inversa entonces agregamos ! despues de if
 la "q" sirve para que grep no nos devuelva las lineas donde encontró algo. Ideal para Scripts.





No hay comentarios:

Publicar un comentario