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

Linux awk 명령어

Linux 명령어大全

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

语法

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

选项参数说明:

  • -F fs or --field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

  • -v var=value or --asign var=value
    赋值一个用户定义变量。

  • -f scripfile or --file scriptfile
    从脚本文件中读取awk命令。

  • -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

  • -W compact or --compat, -W traditional or --traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

  • -W copyleft or --copyleft, -W copyright or --copyright
    打印简短的版权信息。

  • -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

This'ss

awk -s

사용법 넷:

 $ awk -f {awk 스크립트} {파일 이름}

예제:

예제:설명
연산자 +연산자 -연산자 *연산자 /f cal.awk log.txt **연산자= %= ^=
=할당
?:C 조건 표현식
||논리 OR
&&논리 AND
~ 및 !~< <= > >= != ==
관계 연산자공백
+ -결합
* / 추가, 감소%
+ - 곱, 나누기 및 나머지!
일원적 추가, 감소 및 논리 비 ***^
++ --승幂
$증가 또는 감소하여 접두사나 접미사로 사용
필드 참조in

첫 번째 열이 큰 행을 필터링2의 행을 필터링

$ awk '$1>2수组成员
#출력
3 Are you like awk
This's a test
10 There are orange,apple,mongo

첫 번째 열이 'log.txt #명령'과 일치하는 행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출력 레코드 구분자(기본 값은 한 개의 개행 문자)
RLENGTHmatch 함수에 의해 일치하는 문자열의 길이
RS레코드 구분자(기본 값은 한 개의 개행 문자)
RSTARTmatch 함수에 의해 일치하는 문자열의 첫 번째 위치
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 "%---------------------------------------------\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 $

정규 표현식 사용, 문자열 일치

# 두 번째 열에 "th"를 포함하는 열 출력 및 두 번째 열과 네 번째 열 출력
$ awk '$2 ~ /th/ {print $2$4}' log.txt
---------------------------------------------
this a

~ 表示 패턴 시작。// 이 안에 패턴입니다。

# "re"를 포함하는 행 출력
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

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

모드 반대

$ 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

awk 스크립트

awk 스크립트에 대해서는 BEGIN과 END라는 두 가지 키워드를 주의해야 합니다。

  • BEGIN{ 이 안에 실행 전에 실행할 명령어를 넣습니다 }

  • END {이 안에 모든 행을 처리한 후에 실행할 명령어를 넣습니다 }

  • {이 안에 처리할 각 행에 대한 명령어를 넣습니다}

이렇게 한 파일(학생 성적 표)이 있습니다:

$ 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

우리의 awk 스크립트는 다음과 같습니다:

$ cat cal.awk
#!/bin/awk -f
# 실행 전
BEGIN {
    수학 = 0
    영어 = 0
    컴퓨터 = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
# 실행 중
{
    수학+=$3
    영어+=$4
    컴퓨터+=$5
    printf "%"-6s %-6s %4d %8d %8d %8d\n$1, $2, $3$4$5, $3+$4+$5
}
# 실행 후
END {
    printf "---------------------------------------------\n"
    printf "    총:%10d %8d %8d \n", math, english, computer
    printf "평균:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

결과를 보겠습니다:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   총
---------------------------------------------
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
---------------------------------------------
  총:       319      393      350
평균:     63.80    78.60    70.00

다른 예제들

AWK의 hello world 프로그램은 다음과 같습니다:

BEGIN { print "Hello, world!" }

파일 크기 계산

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

파일에서 길이가 큰 80의 행:

awk 'length>80' log.txt

나인九章 곱셈 표 출력

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 명령어大全