Programación de shell | herramientas de procesamiento de texto: expresiones regulares, grep, sed, awk


Si desea utilizar estas herramientas de transmisión, debe comprender las expresiones regulares . Dado que las expresiones regulares tienen mucho contenido, un blog definitivamente no estará terminado , por lo que aquí hay una breve introducción a la sintaxis común de las expresiones regulares.

Expresión regular

Metacarácter

Opciones Descripción
\ Personaje de escape
. Coincide con cualquier personaje
* Coincide con el carácter anterior 0 o n veces
^ Inicio del partido
PS Final del partido
[Arizona] Coincide con cualquier carácter entre corchetes

Metacaracteres extendidos

Opciones Descripción
+ Coincidir con la expresión regular anterior al menos una vez
Coincide con la expresión regular anterior, 0 o una vez

La combinación de estos metacaracteres se convierte en una expresión regular, que se demostrará en los casos de uso de las siguientes herramientas


A continuación se presentan los tres espadachines del procesamiento de texto en streaming en Linux: herramienta de filtrado de texto grep, herramienta de edición de texto sed, generador de informes de texto awk

grep

grep es una poderosa herramienta de búsqueda de texto, que puede buscar texto usando expresiones regulares e imprimir las líneas coincidentes. También es una de las herramientas más utilizadas en Linux.

gramática

grep [选项](查询内容)(参数)

Opciones comunes

-i:忽略大小写
-r:递归读取一个目录下所有文件
-E:支持拓展正则表达式

y

Sed es una poderosa herramienta de edición de texto. Procesa una línea de contenido a la vez, almacena la línea procesada actual en un búfer temporal (espacio de patrón) durante el procesamiento, luego usa el comando sed para procesar el contenido en el búfer, envía los datos procesados ​​al terminal y luego genera la siguiente línea de datos. Hasta el final del archivo

gramática

sed [选项] '命令' (参数)

Opciones comunes

-e:直接在指令列模式上进行sed的动作编辑,即可以使用多次命令
-n:只输出匹配行(也可以指定修改行)
-r:支持使用扩展正则表达式

Comandos comunes

a:追加,在下一行出现
i:插入,在上一行出现
d:删除
s:查找并替换 
p:打印当前模式空间内容

Utilice demostración, agregue, elimine y modifique los siguientes textos respectivamente

hello
world
this
is
test
file
aaaaa
bbbbbbb
cccccccccc
123123124
world
hello

Agregue xxxxxxxxx a la siguiente línea de la línea que comienza con t

cat test3 | sed '/^t/axxxxxxxxx'

Inserte la descripción de la imagen aquí
Eliminar todas las líneas que terminan en d

cat test3 | sed '/d$/d'

Inserte la descripción de la imagen aquí
Reemplaza todo b en el texto con d

cat test3 | sed 's/b/d/g'

Inserte la descripción de la imagen aquí


awk

Awk es una poderosa herramienta de análisis de texto que lee el archivo línea por línea, corta cada línea con un espacio como separador predeterminado y analiza la parte cortada.

De hecho, awk es un lenguaje de programación utilizado para procesar archivos de texto, y gawk es una implementación específica de este lenguaje de programación, por lo que admite operaciones aritméticas, juicios condicionales y sintaxis de control de flujo similar a los shells.

La siguiente es la descripción de awk en el manual del hombre, cuando consultamos awk, saltará automáticamente a gawk
Inserte la descripción de la imagen aquí

gramática

awk [选项] ‘匹配模式1{
    
    执行操作1} 匹配模式2{
    
    执行操作2}......(参数)

Nota: solo las filas que coincidan con el patrón ejecutarán la acción

Al mismo tiempo, también puede especificar el contenido que se ejecutará al principio y al final

awk [选项] ‘BEGIN{
    
    开始时执行的内容} 匹配模式1{
    
    执行操作1} END{
    
    结束时执行的内容}(参数)

Nota: BEGIN se ejecuta antes de todas las líneas de lectura de datos; END se ejecuta después de que se ejecutan todos los datos.

Opciones comunes

-F<分隔字符>:指定输入文件折分隔符
-v:赋值一个用户定义变量

Variables comunes del sistema

FILENAME:文件名
NR:已读的记录数(即当前的行数)
NF:浏览记录的域的个数(切割后,列的个数)

Dado que las matrices awk, las operaciones, los juicios condicionales, el control de procesos, las funciones, etc. son muy similares al lenguaje shell y c, no dedicaré mucho tiempo a esto aquí.

Demostración de uso: cortar la dirección IP de ens38 en ifconfig

ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.220.128  netmask 255.255.255.0  broadcast 192.168.220.255
        inet6 fe80::8e00:5dc0:711b:a9cf  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:4e:dd:e4  txqueuelen 1000  (Ethernet)
        RX packets 1513042  bytes 952654297 (908.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1444185  bytes 1229233776 (1.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 185821127  bytes 25600956325 (23.8 GiB)
        RX errors 0  dropped 5322  overruns 0  frame 0
        TX packets 185821127  bytes 25600956325 (23.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ifconfig ens38 | grep inet\  | awk -F " " '{print$2}'

Inserte la descripción de la imagen aquí
Ejemplo de uso: busque las líneas en blanco en el texto

the day is sunny the the

the sunny is is
awk '/^$/{print NR}' words

Inserte la descripción de la imagen aquí


Otras herramientas habituales

Las siguientes son otras herramientas de uso común, debido a su uso simple, por lo que aquí hay una breve introducción

cortar

La función principal del corte es cortar datos.

gramática

cut [选项](参数)

Opciones comunes

-f:列号,提取第几列
-d<分隔字符>:分隔符,按照指定分隔符分割列

Ejemplo de uso: obtenga el nombre en el texto

name age
alice 21
ryan 30
cat test | cut -d ' ' -f 1

Inserte la descripción de la imagen aquí


ordenar

ordenar contenido de texto para ordenar

gramática

sort [选项](参数)

Opciones comunes

-t<分隔字符>:指定排序时所用的栏位分隔字符
-n:依照数值的大小排序
-r:以相反的顺序来排序
-k:指定需要排序的列

Usar demostración: ordenar datos en texto

123123
42
647
453
6789
23
1
457
97312
cat nums | sort -n

Inserte la descripción de la imagen aquí


uniq

El comando uniq se usa para deduplicar el flujo de datos , generalmente se usa junto con sort

gramática

uniq [选项](参数)

Parámetros comunes

-c:在每列旁边显示该行重复出现的次数;
-d:仅显示重复出现的行列;

Utilice la demostración: cuente el número de ocurrencias de cada palabra en el texto

the
day
is
sunny
the
the
the
sunny
is
is

Primero elimine los duplicados y ordene según el número de repeticiones

cat test2 | uniq -c | sort -n

Inserte la descripción de la imagen aquí


tr

tr se usa para modificar, reemplazar y comprimir contenido de texto

gramática

tr [选项](参数)

Parámetros comunes

-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示

Ejemplo de uso: convertir minúsculas a mayúsculas

the day is sunny the the
the sunny is is
cat words | tr 'a-z' 'A-Z'

Inserte la descripción de la imagen aquí


Preguntas comunes de entrevistas

Las siguientes preguntas se derivan de leetcode

Décima línea

leetcode-195. La décima línea

Dado un archivo de texto file.txt, imprima solo la décima línea de este archivo.

Ejemplo:
supongamos que file.txt tiene el siguiente contenido:

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

Su secuencia de comandos debe mostrar la décima línea:

Line 10

Descripción:

  1. Si el archivo tiene menos de diez líneas, ¿qué debería generar?
  2. Hay al menos tres soluciones diferentes; pruebe tantos métodos como sea posible para resolver el problema.

responder:

解法1:sed -n '10p' file.txt
解法2:awk 'NR==10{print $0}' file.txt
解法3:tail -n +10 file.txt | head -n 1

Ideas para la resolución de problemas:

  1. La idea de la solución 1 es usar la opción -n de sed para mostrar solo las líneas coincidentes, y luego usar el comando p para generar la décima línea
  2. La idea de la solución 2 es usar la variable de sistema NR en awk para especificar el número de línea
  3. La idea de la solución 3 es usar primero la opción tail -n +10 (+ es el número de línea de inicio especificado) para obtener el contenido a partir de la décima línea, y luego usar head -n 1 para filtrar, es decir, solo queda el primer dato. ¿Cuál es el contenido de la décima línea?

Número de teléfono válido

leetcode-193. Número de teléfono válido

Dado un archivo de texto file.txt que contiene una lista de números de teléfono (un número de teléfono por línea), escriba un script bash para generar todos los números de teléfono válidos.

Puede asumir que un número de teléfono válido debe cumplir con los dos formatos siguientes: (xxx) xxx-xxxx o xxx-xxx-xxxx. (X representa un número)

También puede suponer que no hay espacios adicionales antes y después de cada línea.

Ejemplo:
suponga que el contenido de file.txt es el siguiente:

987-123-4567
123 456 7890
(123) 456-7890

Su secuencia de comandos debe generar los siguientes números de teléfono válidos:

987-123-4567
(123) 456-7890

responder:

awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt

Ideas para la resolución de problemas:

  1. Use awk directamente para hacer coincidir con expresiones regulares

Frecuencia estadística de palabras

leetcode-192. Frecuencia estadística de palabras

Escriba un script bash para contar la frecuencia de cada palabra en un archivo de texto words.txt.

Por simplicidad, puede asumir:

words.txt solo incluye letras minúsculas y ''.
Cada palabra consta de letras minúsculas únicamente.
Las palabras están separadas por uno o más espacios

Ejemplo:

the day is sunny the the
the sunny is is

Su secuencia de comandos debería generar (en orden descendente de frecuencia de palabras):

the 4
is 3
sunny 2
day 1

responder:

cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr | awk '{print $2,$1}'

Ideas para la resolución de problemas:

  1. Dado que cada palabra está separada por un espacio y el resultado se cuenta por línea, use el comando tr para reemplazar el espacio con un carácter de nueva línea, haciendo que cada palabra sea una línea
  2. Necesitamos contar el número de ocurrencias, así que primero use sort para ordenar los datos de modo que los adyacentes estén muy juntos, luego use uniq para ordenar, y use la opción -c para contar el número de repeticiones
  3. Use sort -nr para ordenar en orden descendente usando el número de repeticiones
  4. Use awk para procesar el texto, coloque la palabra al frente y el número de veces al final

Transponer archivo

leetcode-194. Transponer archivo

Dado un archivo file.txt, transponga su contenido.
Puede asumir que el número de columnas en cada fila es el mismo y que cada campo está separado por "".

Ejemplo:
suponga que el contenido de file.txt es el siguiente:

name age
alice 21
ryan 30

Debería generar:

name alice ryan
age 21 30

responder:

awk '{
    for (i=1; i<=NF; i++)
    {
        if (NR==1)  
        {
            res[i]=$i
        }
        else
        {
            res[i]=res[i]" "$i
        }
    }
}
END{	
    for(j=1; j<=NF; j++)
    {
        print res[j]
    }
}'  file.txt

Ideas para la resolución de problemas:

  1. Según el significado de la pregunta, necesitamos invertir las filas y columnas, por lo que necesitamos una matriz para almacenar la cadena de cada fila
  2. Cuando el número de línea es 1, significa que la palabra i en el número de columna es el comienzo de la i-ésima línea
  3. Cuando el número de fila no es 1, agregue la i-ésima palabra en el número de columna al i-ésimo elemento de la matriz, que es la i-ésima fila después de la inversión
  4. Cabe señalar que, dado que awk lee por fila, solo necesitamos una capa de bucle para procesar cada columna.

Supongo que te gusta

Origin blog.csdn.net/qq_35423154/article/details/109285753
Recomendado
Clasificación