Script de shell detallado (11): lenguaje de programación de procesamiento de datos y texto awk
1. El comando awk: un lenguaje de programación para procesamiento de texto y datos
- El comando awk es un lenguaje de programación que se utiliza para procesar texto y datos en linux / unix.
- Y admite funciones avanzadas como funciones definidas por el usuario y expresiones regulares dinámicas, y es una poderosa herramienta de programación en linux / unix.
1. Principio de funcionamiento
-
Lea el texto línea por línea, separado por espacio o tabulación de forma predeterminada, guarde los campos separados en variables integradas y ejecute comandos de edición de acuerdo con el modo o condición.
-
El comando sed se usa a menudo para procesar una línea completa, mientras que awk tiende a dividir una línea en múltiples "campos" y luego procesarla. La lectura de la información de awk también se lee línea por línea, y el resultado de la ejecución se puede imprimir y mostrar con los datos de campo a través de la función de impresión. En el proceso de usar el comando awk, puede usar los operadores lógicos "&&" para significar "y", "||" para significar "o", y "!" Para significar "no"; también puede realizar operaciones matemáticas simples operaciones, como +, -, *, /,%, ^ representan suma, resta, multiplicación, división, resto y potencia, respectivamente.
2. Formato de comando
3. Variables integradas comunes de awk (se pueden usar directamente)
Variables integradas | Descripción |
---|---|
FS | Separador de columnas. Especifique el separador de campo para cada línea de texto, el valor predeterminado es un espacio o una tabulación. Igual que "-F" |
NF | El número de campos en la fila que se está procesando actualmente. |
NO | El número de fila (número ordinal) de la fila que se está procesando actualmente |
$ 0 | Todo el contenido de la línea procesada actualmente |
$ n | El enésimo campo (columna n) de la fila procesada actualmente |
NOMBRE DEL ARCHIVO | Nombre de archivo que se está procesando |
RS | Separador de líneas. Cuando awk lee datos de un archivo, cortará los datos en muchos registros de acuerdo con la definición de RS, mientras que awk solo lee un registro a la vez para su procesamiento. El valor predeterminado es '\ n' |
4. Salida de texto por línea
- El modo BEGIN significa que antes de procesar el texto especificado, debe realizar la acción especificada en el modo BEGIN; awk procesa el texto especificado y luego ejecuta la acción especificada en el modo END. El bloque de instrucciones END {} a menudo se imprime Declaraciones como resultados.
5. Salida de texto por campo
6. Invocar comandos de Shell a través de canalizaciones y comillas dobles
7 、 getline
- Cuando no hay un carácter de redirección "<" o "|" a la izquierda y derecha de getline, getline actúa sobre el archivo actual y lee la primera línea del archivo actual a la variable var o $ 0 seguida de ella; debería ser señaló que debido a que awk ya ha procesado getline antes de que se lea A line, el resultado de retorno de getline está entrelazado.
- Cuando hay caracteres de redirección "<" o "|" a la izquierda y derecha de getline, getline actúa sobre el archivo de entrada direccional. Dado que el archivo se acaba de abrir y awk no lo ha leído en una línea, simplemente getline lo lee, luego getline devuelve esta La primera línea del archivo, no cada dos líneas.
2. Ejemplo simple: extraiga la dirección IP local y realice una conversión binaria
método uno:
#获取IP
ifconfig | awk '(NR==2) {print $2}'
#分字段操作
ifconfig |awk '(NR==2) {print $2}' | awk 'BEGIN {RS="."} ; {print} '
#对分段后的IP地址赋值给一个变量
x=`ifconfig |awk '(NR==2) {print $2}' | awk 'BEGIN {RS="."} ; {print} '`
#进行外层循环,四次
for a in $x
do
#进行内循环,选用减法进行循环,如果外层循环的值比被减数大,则取余数,并输出1;反之则输出0,且不取减法结果。
for ((i=1;i<=255;i+=$i))
do
m=$[128/$i]
sum=$[$a-$m]
if [ $a -ge $m ]
then
a=$[$a-$m]
echo -n "1" #不换行输出
else
echo -n "0" #不换行输出
fi
done
echo " " #进行系统默认的空格换行操作
done > 123.txt
#进行结果的输出,并把结果中的空格全部替换成 "."号
IP="`cat 123.txt`"
echo $IP | sed 's/ /./g'
Método dos (función + versión interactiva)
#!/bin/bash
#定义一个函数,使用位置变量来进行操作
ip(){
x=`echo $1 | awk 'BEGIN {RS="."} ; {print} '`
for a in $x
do
#进行内循环,选用减法进行循环,如果外层循环的值比被减数大,则取余数,并输出1;反之则输出0,且不取减法结果。
for ((i=1;i<=255;i+=$i))
do
m=$[128/$i]
sum=$[$a-$m]
if [ $a -ge $m ]
then
a=$[$a-$m]
echo -n "1"
else
echo -n "0"
fi
done
echo -e "\t"
done
}
##############################
read -p "请输入想要转换的IP地址:" p #定义交互式变量P
list="`ip $p`" #把调用函数后得出的结果放入列表中
echo $list | sed 's/ /./g' #输出列表,并对分隔符进行替换