comando awk Linux
comando awk Linux
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