Directorio de artículos
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'
Eliminar todas las líneas que terminan en d
cat test3 | sed '/d$/d'
Reemplaza todo b en el texto con d
cat test3 | sed 's/b/d/g'
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
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}'
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
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
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
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
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'
Preguntas comunes de entrevistas
Las siguientes preguntas se derivan de leetcode
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:
- Si el archivo tiene menos de diez líneas, ¿qué debería generar?
- 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:
- 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
- La idea de la solución 2 es usar la variable de sistema NR en awk para especificar el número de línea
- 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:
- 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:
- 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
- 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
- Use sort -nr para ordenar en orden descendente usando el número de repeticiones
- 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:
- 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
- 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
- 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
- Cabe señalar que, dado que awk lee por fila, solo necesitamos una capa de bucle para procesar cada columna.