Latest web development tutorials

comando awk Linux

comando awk Linux

Linux comando Daquan Linux comando Daquan

AWK es un archivo de texto de procesamiento del lenguaje, análisis de texto es una herramienta poderosa.

AWK fue llamado, ya que tuvo tres fundadores Alfred Aho, Peter Weinberger, y Brian Kernighan del apellido del primer carácter.

gramática

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

Opciones Descripción de los parámetros:

  • -F Fs o fs --field-separador
    Especificación de un archivo de entrada fuera del separador, fs es una cadena o una expresión regular, como -F:.
  • -v var = valor o var = valor --asign
    Asignar una variable definida por el usuario.
  • scripfile -f o --file archivo de guión
    comando awk lee de un archivo de script.
  • -mf nnn nnn y -mr
    nnn valor de las limitaciones inherentes, el número máximo de bloques nnn límites opción -mf asignadas; opción limita el número máximo -mr registro. Estas dos características son la versión Bell Labs de extensiones en el awk awk norma no se aplica.
  • -W Compacto o --compat, -W tradicional o --traditional
    Que se ejecuta en modo de compatibilidad awk. Así curiosear comportamiento y exactamente el mismo estándar de awk, awk todas las extensiones son ignorados.
  • -W Copyleft o --copyleft, los derechos de autor o -W --copyright
    Imprimir la información de derechos de autor breve.
  • Ayuda -W o --help, uso o -W --usage
    Imprimir una breve descripción de todas las opciones de awk y cada opción.
  • -W Pelusa o --lint
    Imprimir advertencias no a la estructura tradicional de la portabilidad de Unix.
  • -W Pelusa de edad o --lint de edad
    La impresión no puede ser trasplantado a la advertencia tradicional estructura de la plataforma UNIX.
  • -W Posix
    Activar el modo de compatibilidad. Con las siguientes restricciones, no reconoce: / x, tecla de función, func, secuencias de escape, y cuando FS es un espacio, la nueva línea como un separador de campo; operadores ** y ** = no pueden sustituir a ^ y ^ =; fflush válido.
  • -W Re-intervalo o --re-inerval
    Permitir que las expresiones de intervalo en uso regular, la referencia (grep en las clases de caracteres POSIX), tales como expresiones con corchetes [[: alpha:]].
  • Fuente -W programa de texto o --source programa de texto
    Uso del programa de texto como código fuente, se puede mezclar con el comando -f.
  • Versión -W o --version
    Versión para imprimir la presentación de información de errores.

Uso básico

registro.txt texto dice lo siguiente:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Use un:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

Ejemplo:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

Uso II:

awk -F  #-F相当于内置变量FS, 指定分割字符

Ejemplo:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

Utilizar tres:

awk -v  # 设置变量

Ejemplo:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

Utilice cuatro:

awk -f {awk脚本} {文件名}

Ejemplo:

 $ awk -f cal.awk log.txt

operadores

operadores descripción
= + = - = * = / =% = ^ = ** = asignación
?: C expresión condicional
|| lógico o
&& La lógica y la
~ ~! La expresión regular no coincide con la expresión regular
<< = >> =! = == Los operadores relacionales
en blanco conexión
+ - Además, resta
* / Y Multiplicación, división y resto
+ -! más unario, menos, y la negación lógica
^ *** exponenciación
++ - Aumentado o disminuido, según un prefijo o sufijo
$ referencias de campo
en miembros de la matriz

Filtrado de la primera columna de la fila es mayor que 2

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Filtrado de la primera columna de la fila 2 iguales

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

Filtrado de la primera fila y la segunda columna es mayor que 2 es igual a la columna 'Son' de

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

Las variables de

variable descripción
\ $ N N-ésimo campo del registro actual, separados por FS entre los campos
\ $ 0 registro de entrada completa
ARGC El número de parámetros de línea de comandos
ARGIND Posición en la línea de comandos del archivo actual (empieza a contar desde 0)
ARGV Matriz contiene los argumentos de línea de comandos
CONVFMT Formato variable de la conversión digital matriz asociativa entorno ENVIRON (el valor predeterminado es .6g%)
ERRNO Por último, una descripción de error del sistema
FIELDWIDTHS La anchura de la lista de campos (separados por un espacio)
FILENAME Nombre del archivo actual
FNR Con NR, sino en relación con el archivo actual
FS Separador de campo (por defecto es cualquier espacio)
IGNORECASE Si es verdad, el partido entre mayúsculas y minúsculas
NF El número de campos en el registro actual
NR El número actual de registros
OFMT Formato de salida digital (por defecto es .6g%)
OFS separador de campos de salida (por defecto es un espacio)
SRO El registro de salida del separador (por defecto es un salto de línea)
RLENGTH La longitud del partido por la cadena coincide con la función
RS separador de registro (por defecto es un salto de línea)
RSTART La primera posición se corresponde con la cadena coincide con la función
SUBSEP separador de subíndice (por defecto es / 034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

Utilice una coincidencia de cadenas regulares

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ Un esquema comienza.// Es el modo.

# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

ignorar mayúsculas

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

modo negada

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

guión awk

Sobre la escritura de awk, tenemos que prestar atención a dos palabras clave BEGIN y END.

  • Begin {no se pone antes de ejecutar las sentencias}
  • FIN {Esta es una declaración que puso todas las filas después del tratamiento para ser ejecutado}
  • {Este es un proceso que colocar la instrucción que se ejecutará para cada fila}

Supongamos que un documento de este tipo (tabla de rendimiento de los estudiantes):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

Nuestro script awk de la siguiente manera:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

Nos fijamos en la aplicación de los resultados:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

Otros ejemplos

AWK es un programa hola mundo:

BEGIN { print "Hello, world!" }

Tamaño del archivo Cálculo

$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581

Para averiguar a través de un archivo más grande que la longitud de la línea 80

awk 'lenght>80' log.txt

Imprimir tabla de multiplicar

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

Más información detallada se puede ver manual oficial AWK: http://www.gnu.org/software/gawk/manual/gawk.html

Linux comando Daquan Linux comando Daquan