English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Comando awk de Linux

大全命令Linux

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

Se llama AWK porque toma las primeras letras del apellido de los tres fundadores Alfred Aho, Peter Weinberger y Brian Kernighan.

Sintaxis

awk [opciones] 'script' var=value archivo(s)
o
awk [opciones] -f archivo_scriptfile var=value archivo(s)

Descripción de los parámetros de opción:

  • -F fs o --campo-separador fs
    Especificar el separador de archivo de entrada, fs es una cadena o una expresión regular, como-F:.

  • -v var=value o --asign var=value
    Asignar una variable definida por el usuario.

  • -f scripfile o --archivo scriptfile
    Leer comandos awk desde un archivo de script.

  • -mf nnn y -mr nnn
    Establecer limitaciones internas para el valor nnn;-La opción mf limita el número máximo de bloques asignados a nnn;-La opción mr limita el número máximo de registros. Estas dos funciones son extensiones de la versión de awk del Laboratorio Bell, que no se aplican en awk estándar.

  • -W compacto o --compat, -W tradicional o --tradicional
    Ejecutar awk en modo compatible. Por lo tanto, el comportamiento de gawk es completamente idéntico al de awk estándar, todas las extensiones de awk se ignoran.

  • -W copyleft o --copyleft, -W copyright o --copyright
    Imprimir información de copyright breve.

  • -W help or --help, -W usage or --usage
    打印全部awk选项和每个选项的简短说明。

  • -W lint or --lint
    打印不能向传统unix平台移植的结构的警告。

  • -W lint-old or --lint-old
    打印关于不能向传统unix平台移植的结构的警告。

  • -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

  • -W re-interval or --re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

  • -W source program-text or --source program-text
    使用program-text作为源代码,可与-f命令混用。

  • -W version or --version
    打印bug报告信息的版本。

基本用法

log.txt文本内容如下:

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

用法一:

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

示例:

# 每行按空格或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

用法二:

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

示例:

# 使用","分割
 $  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

用法三:

awk -v  # 设置变量

示例:

 $ 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

用法四:

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

示例:

 $ awk -f cal.awk log.txt

运算符

运算符描述
= += -= *= /= %= ^= **=赋值
?:C条件表达式
||逻辑或
&&逻辑与
~ 和 !~匹配正则表达式和不匹配正则表达式
< <= > >= != ==关系运算符
空格连接
+ -加,减
* / %乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ --增加或减少,作为前缀或后缀
$字段引用
in数组成员

过滤第一列大于2的行

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

过滤第一列等于2的行

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

过滤第一列大于2并且第二列等于'Are'的行

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

内建变量

变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致。
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "%---------------------------------------------
"} {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 "%---------------------------------------------
"} {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
# Salida de números de orden NR, número de línea coincidente FNR
$ 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
# Especificar el separador de salida
$ $ awk '{print "$1$2$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk $
This's $ a $
10 $ There $

usando expresiones regulares, coincidencia de cadenas

# Salida de la segunda columna que contiene "th", e imprime la segunda y cuarta columnas
$ awk '"2 ~ /th/ {print "$2$4}' log.txt
---------------------------------------------
this a

~ indica el inicio del patrón.// es el patrón.

# Salida de líneas que contienen "re"
$ awk '"/re/ " log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

ignorar mayúsculas y minúsculas

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

patrón inverso

$ 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

script awk

Sobre el script awk, debemos prestar atención a dos palabras clave BEGIN y END.

  • BEGIN{ Aquí se colocan las instrucciones antes de la ejecución }

  • END {Aquí se colocan las instrucciones a ejecutar después de procesar todas las líneas }

  • {Aquí se colocan las instrucciones a ejecutar en cada línea}

Supongamos que tenemos un archivo (tabla de calificaciones de 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 es el siguiente:

$ 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
}
# ejecutar después de
END {
    printf ""---------------------------------------------\n"
    printf " TOTAL:%\n"10d %8d %8d %\n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

miremos el resultado ejecutar:

$ 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

programa hello world AWK es:

BEGIN { print "Hello, world!" }

tamaño archivo calcula

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

encontrar longitud mayor que 8líneas 0 de:

awk 'length>80' log.txt

tabla multiplicar imprime

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")'

大全命令Linux