comando awk Linux
comando awk Linux
AWK é um arquivos de texto processamento de linguagem, análise de texto é uma ferramenta poderosa.
AWK foi chamado porque levou três fundadores Alfred Aho, Peter Weinberger e Brian Kernighan do nome de família do primeiro caractere.
gramática
awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)
Opções Parâmetro Descrição:
- -F Fs ou fs --field-separadoras
Especificando um arquivo de entrada off separador, fs é uma string ou uma expressão regular, como F:. - -v var = valor ou var --asign = valor
Atribuir uma variável definida pelo usuário. - scripfile -f ou --file scriptfile
comando awk lidos de um arquivo script. - -MF nnn e MR nnn
valor nnn de limitações inerentes, o número máximo de blocos nnn limites de opção -MF atribuídas; opção limita o número máximo MR registro. Estas duas características são a versão Bell Labs de extensões awk no awk norma não se aplica. - -W Compact ou --compat, -W tradicional ou --traditional
Correr no modo de compatibilidade awk. Então embasbacar comportamento e exatamente o mesmo awk padrão, awk todas as extensões são ignorados. - -W Copyleft ou --copyleft, copyright -W ou --copyright
Imprimir Informação breve copyright. - Ajuda -W ou --help, o uso -W ou --usage
Imprimir uma breve descrição de todas as opções de awk e cada opção. - -W Lint ou --lint
avisos de impressão não para a estrutura da portabilidade tradicional Unix. - -W Lint de idade ou --lint-old
A impressão não pode ser transplantado para o aviso estrutura de plataforma UNIX tradicional. - -W Posix
Ativar o modo de compatibilidade. Com as seguintes restrições, não reconhece: / x, tecla de função, func, sequências de escape, e quando fs é um espaço, a nova linha como um separador de campo; operadores ** e ** = não pode substituir ^ e ^ =; fflush inválido. - -W Re-intervalo ou --re-inerval
Permitir expressões de intervalo em uso regular, de referência (grep nas classes de caracteres POSIX), como expressões de colchetes [[: alpha:]]. - -W Fonte programa de texto ou de texto programa --source
Use-texto de programa em código-fonte pode ser misturado com o comando -f. - -W Versão ou --version
Imprimir versão bug divulgação de informações.
uso Básico
texto log.txt é o seguinte:
2 this is a test 3 Are you like awk This's a test 10 There are orange,apple,mongo
Use um:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
exemplo:
# 每行按空格或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, 指定分割字符
exemplo:
# 使用","分割 $ 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
Use três:
awk -v # 设置变量
exemplo:
$ 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
Use quatro:
awk -f {awk脚本} {文件名}
exemplo:
$ awk -f cal.awk log.txt
operadores
operadores | descrição |
---|---|
= + = - = * = / =% = ^ = ** = | atribuição |
?: | expressão condicional C |
|| | lógico ou |
&& | lógica e |
~ ~! | Coincidir com a expressão regular não corresponde a expressão regular |
<< = >> =! = == | Operadores relacionais |
em branco | conexão |
+ - | Adição, subtração |
* / & | Multiplicação, divisão e resto |
+ -! | além Unário, menos, e negação lógica |
^ *** | exponenciação |
++ - | Aumentada ou diminuída, como um sufixo ou prefixo |
$ | referências de campo |
em | membros da matriz |
Filtrando a primeira coluna da linha é maior do que dois
$ awk '$1>2' log.txt #命令 #输出 3 Are you like awk This's a test 10 There are orange,apple,mongo
Filtrando a primeira coluna da linha 2 é igual a
$ awk '$1==2 {print $1,$3}' log.txt #命令 #输出 2 is
Filtrando a primeira linha ea segunda coluna é superior a 2 coluna é igual a 'são' de
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令 #输出 3 Are you
Variáveis internas
variável | descrição |
---|---|
\ $ N | N-th campo do registro atual, separados por FS entre os campos |
\ $ 0 | registro de entrada completa |
ARGC | O número de parâmetros de linha de comando |
ARGIND | Posição sobre a linha do arquivo corrente de comando (começar a contar a partir de 0) |
ARGV | Matriz contém os argumentos de linha de comando |
CONVFMT | formato de matriz associativa conversão digital variável de ambiente ENVIRON (o padrão é% .6g) |
ERRNO | Finalmente, uma descrição de erro do sistema |
FIELDWIDTHS | A largura da lista de campos (separados por um espaço) |
FILENAME | Nome do arquivo atual |
FNR | Com NR, mas em relação ao arquivo atual |
FS | separador de campo (o padrão é todos os espaços) |
ignoreCase | Se for verdade, o jogo de maiúsculas e minúsculas |
NF | O número de campos no registro atual |
NR | O número atual de registros |
OFMT | Formato de saída digital (o padrão é% .6g) |
OFS | separador de campo de saída (o padrão é um espaço) |
ORS | O separador de registro de saída (o padrão é uma nova linha) |
RLENGTH | O comprimento do jogo pela cadeia função jogo |
RS | separador de registro (o padrão é uma nova linha) |
RSTART | A primeira posição é compensada pela cadeia função jogo |
SUBSEP | separador subscrito de matriz (o padrão é / 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 $
Use uma correspondência seqüência regular
# 输出第二列包含 "th",并打印第二列与第四列 $ awk '$2 ~ /th/ {print $2,$4}' log.txt --------------------------------------------- this a
~ Um esquema começa.// Modo é.
# 输出包含"re" 的行 $ awk '/re/ ' log.txt --------------------------------------------- 3 Are you like awk 10 There are orange,apple,mongo
ignorar caso
$ 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
script awk
Sobre script awk, é preciso prestar atenção a duas palavras-chave BEGIN e END.
- BEGIN {não é colocado antes de executar as declarações}
- END {Esta é uma afirmação que colocou todas as linhas após o processamento a ser executado}
- {Este é um processo que colocar a declaração a ser executada para cada linha}
Suponha que tal documento (tabela desempenho do aluno):
$ 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
Nosso script awk como segue:
$ 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 }
Nós olhamos para a implementação dos 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
Outros exemplos
AWK é um programa Olá mundo:
BEGIN { print "Hello, world!" }
Arquivo cálculo do tamanho
$ ls -l *.txt | awk '{sum+=$6} END {print sum}' -------------------------------------------------- 666581
Para descobrir a partir de um arquivo maior do que o comprimento da linha 80
awk 'lenght>80' log.txt
tabela de multiplicação de impressão
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")}'
manual oficial AWK Informações mais detalhadas podem ser vistos: http://www.gnu.org/software/gawk/manual/gawk.html