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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

  • 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

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

6. Invocar comandos de Shell a través de canalizaciones y comillas dobles

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

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.

Inserte la descripción de la imagen aquí

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'

Inserte la descripción de la imagen aquí

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'            #输出列表,并对分隔符进行替换

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Lucien010230/article/details/114854014
Recomendado
Clasificación