Latest web development tutorials

comando awk Linux

comando awk Linux

Linux comando Daquan Linux comando Daquan

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

Linux comando Daquan Linux comando Daquan