9 - Shell

Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 15

Grep, awk y sed

Tres útiles líneas de comando

Laboratorio de Sistemas Operativos I

Lecturer: Fernando A. Lovera


MYS 228
Grep = global regular expression print

En terminos generales, grep (Global Regular Expression Print) va a recibir archivos


Para una busqueda de un string.

Comienza en la pimera línea y avanza línea por linea, grep copia una línea en un
Buffer y la compara con el string que está buscando, y si la comparasión pasa, imprime la
linea en pantalla.

Grep repite el proceso anterior hasta que el archivo no tiene lineas.


Ejemplo: archivo de datos
Cortar y pegar la siguiente data en un archio: El ejemplo más sencillo de
bota Grep es:
Libro
bebida $ grep “bo” archivo.txt
maquina
botas Que retorna:
ladrar bota
USB botas
arepa$
Opciones útiles
Algo un poco mejor y útil seria identificar en que linea del archivo se
Encuentran, en esta manera es más fácil saber en donde están los
Strings o caracteres. Esto se hace agregando el parámetro “-n”.

$ grep –n “bo” archivo.txt

Fernandos-MacBook-Pro:Desktop fernandolovera$ grep -n "bo" archivo.txt


1:bota
5:botas
Otra opción interesante es: -v, la que imprime el resultado negativo.
2:Libro
3:bebida
4:maquina
6:ladrar
7:USB
8:arepa$
9:
Opciones utiles
La opcion –c suprime la lineas que hacen match, y solo muestra el numero
De linea que cumplió con el query. Por ejemplo, lo siguiente imprime solo un
Número:
$ grep -c "bo" archivo.txt
2

La opción –l imprime solo el nombre del archivo en el query que tiene lineas que
Hacen match en la busqueda. Util para cuando estas buscando en varios archivos.
$ grep –l “bo”

Si utilizas –I te considera minúsculas y mayúsculas.


$ grep –i “BO” archivo

Por el contrario –x es el match exacto


$ grep –x “bO” arhivo.txt
Opciones útiles
Finalmente, -A permite especificar lineas adicionales del contexto de lo que
Buscas, entonces obtienes un string lo que buscas), y un numero de lineas
adicionales

Fernandos-MacBook-Pro:Desktop fernandolovera$ grep -A2 "ma" archivo.txt


maquina
botas
ladrar
Expresiones regulares (REGEX)

Es una manera de describir patrones complejos en un texto. Con grep, puedes usar
REGEX para buscar patrones.
Las cadenas normales que hemos estado usando hasta ahora son expresiones
regulares muy simples. También puede encontrarlos si usa comodines como '*' o '?'
al enumerar nombres de archivos, etc. Puede usar grep para buscar usando
expresiones regulares básicas, como buscar líneas que terminen con la letra e:

Fernandos-MacBook-Pro:Desktop fernandolovera$ grep "o$" archivo.txt


Libro
Continuación

Si quieres puedes hacer match con una o mas ocurrectias usando el comando ?

Fernandos-MacBook-Pro:Desktop fernandolovera$ grep -E "bota?" archivo.txt


bota
botas

También puedes usar el pipe (|) lo que significa “o” entonces puedes hacer eto:

Fernandos-MacBook-Pro:Desktop fernandolovera$ grep -E "bota|botas" archivo.txt


bota
botas
Caracteres especiales

Si se quiere buscar un caracter especial?, si se quiere encontrar todas las lineas


Que contienen el caracter “$”, entonces no se puede hacer: grep ‘$’ archivo.txt
porque $ se considera una expresión regular, entonces te va a resultar en todas las
Lineas que contienen un final de linea (todas las lineas).

Fernandos-MacBook-Pro:Desktop fernandolovera$ grep '\$' archivo.txt


arepa$
AWK
Un lenguaje de escaneo y procesamiento de patrones de texto, creado por Aho,
Weinberger y Kernighan (de ahí el nombre).
BASICO

Es un comando que opera en todas las lineas de un archivo de entrada. Puede tener
Una sección opcional BEGIN {} que son la precondición, una sección media {} y un END{}
BEGIN { .... Inicialización de comandos awk...}
{ .... Comandos awk...}
END { .... Finalización de awk...}

AWK mira cada linea como un número de campos, cada uno separado por un
‘separador’. Por defecto, este separador es el espacio en blanco.
AWK

Dentro de awk, el primer campo se denomina $ 1, el segundo como $ 2, etc. y


toda la línea se llama $ 0. El separador de campo lo establece la variable interna
awk FS, por lo que si establece FS = ":", dividirá una línea de acuerdo con la
posición del ':' que es útil para archivos como / etc / passwd, etc. Las variables
internas útiles son NR, que es el número de registro actual (es decir, el número
de línea del archivo de entrada) y NF, que es el número de campos en la línea
actual.
AWK
Si se quiere usar AWK en combinación con otros comandos esto puede ser útil. Por ejemplo:
Usamos ls –l para lista los archivos de un directorio:

Por ejemplo, en mi desktop, haciendo:

Fernandos-MacBook-Pro:Desktop fernandolovera$ ls -l
total 8
drwxr-xr-x 11 fernandolovera staff 374 Mar 14 10:28
01698 FERNANDO LOVERA
-rw-r--r-- 1 fernandolovera staff 69 Mar 15 18:18
archivo.txt
Fernandos-MacBook-Pro:Desktop fernandolovera$ ls -l |
awk 'BEGIN {sum=0}{sum=sum+$5} END{print sum}'
443

Es util para saber el tamaño total de todos los archivos en este directorio que podría hacer:
AWK
Tenga en cuenta que 'print sum' imprime el valor de la suma variable, de modo que si sum = 2,
'print sum' da el resultado '2', mientras que 'print $ sum' imprimirá '1', ya que el segundo campo
contiene el valor '1 '.Por lo tanto, sería sencillo escribir un comando awk que calcule la media
y la desviación estándar de una columna de números: acumulará 'sum_x' y 'sum_x2' dentro de
la parte principal, y luego usará las fórmulas estándar para calcular la media y la desviación
estándar en la parte FINAL.AWK proporciona soporte para bucles (tanto 'para' como 'while') y
para bifurcación (usando 'if'). Entonces, si quisieras recortar un archivo y solo operar en cada
3ra línea, por ejemplo, podrías hacer esto:

Fernandos-MacBook-Pro:Desktop fernandolovera$
Fernandos-MacBook-Pro:Desktop fernandolovera$ ls -l | awk '{for (i=1;i<3;i++) {getline}; print
NR,$0}'
3 -rw-r--r-- 1 fernandolovera staff 69 Mar 15 18:18 archivo.txt
sed = stream editor
sed realiza transformaciones de texto básicas en una secuencia de entrada (un archivo
o entrada de una canalización) en una sola pasada a través de la secuencia, por lo que
es muy eficiente. Sin embargo, es la capacidad de sed de filtrar texto en una
canalización que lo distingue particularmente de otros tipos de editor.
sed can be used at the command-line, or within a shell script, to edit a file non-
interactively. Perhaps the most useful feature is to do a 'search-and-replace' for one
string to another.
You can embed your sed commands into the command-line that invokes sed using the '-
e' option, or put them in a separate file e.g. 'sed.in' and invoke sed using the '-f sed.in'
option. This latter option is most
Fernandos-MacBook-Pro:Desktop used if the sedsed
fernandolovera$ commands are complex
-e 's/input/output/' and involve lots
archivo.txt
bota of regexps! For instance:
Libro
bebida
maquina
botas
ladrar
USB
arepa$
Continuación
¿Qué ocurre si uno de los caracteres que desea utilizar en el comando de búsqueda es un
símbolo especial, como '/' (por ejemplo, en un nombre de archivo) o '*', etc.? Entonces debes
escapar del símbolo igual que para grep (y awk). Digamos que quiere editar los scripts del shell
para referirse a / usr / local / bin y not / bin más, entonces podría hacer esto
La forma general es:
sed –e ‘/patron/comando’ mi_archivo

donde 'patrón' es una expresión regular y 'comando' puede ser uno de 's' = buscar y reemplazar,
o 'p' = imprimir, o 'd' = eliminar, o 'i' = insertar, o 'a' = anexar , etc. Tenga en cuenta que la
acción predeterminada es imprimir todas las líneas que no coinciden de todos modos, por lo
que si desea suprimir esto, debe invocar sed con el indicador '-n' y luego puede usar el
comando 'p' para controlar lo que está impreso Entonces, si desea hacer una lista de todos los
subdirectorios, puede usar
Fernandos-MacBook-Pro:Desktop fernandolovera$ ls -l | sed -n -e '/^d/ p'
drwxr-xr-x 11 fernandolovera staff 374 Mar 14 10:28 01698 FERNANDO LOVERA

También podría gustarte