A, AWK 프로필
AWK는 텍스트 파일을 처리하는 언어, 텍스트 분석은 강력한 도구입니다
두 매개 변수 및 구문을 awk가
AWK [파라미터] {인쇄 인쇄} 파일 처리
-F는 : 지정된 파일이 구분 기호로 읽은 것을 나타내는 구분 기호 정의
-v : 변수 모드, 당신은 변수와 통화 (통화 $ 기호를 추가 할 필요가 없습니다)에 할당 할 수 있습니다
AWK의 셋째, 기본적인 사용법
사용자 이름을 출력하고 사용자 명령 인터프리터에서 사용하는 passwd에 다음을 사용하여
# 쪽이든 된 awk -F ' : ' ' {. 인쇄 $ 1 ""$ (7).} ' 의 / etc / passwd에 # 출력
루트 / 빈 / bash는 빈 경우 / sbin / nologin으로 데몬 경우 / sbin / nologin으로 # 두 번째 방법 은 awk -F ' : ' ' { $. 1 인쇄 ""(NF의) $} ' 의 / etc / passwd에 # 출력
루트 / 빈 / bash는 빈 경우 / sbin / nologin으로 데몬 경우 / sbin / nologin으로
NF되는 각 라인 분리 후 컬럼 총계
NR은 행의 수를 나타냅니다
AWK -F은 ':'NR == 5 '은 / etc / {$ 1 ""$ (NF) 인쇄} passwd를 # 요약 다섯째 행
LP / sbin에 /을 nologin으로
용도 II : 복수의 세퍼레이터를 사용하여 분리
# 자명 다섯째 행 및 최종 출력 지령 통역자 된 awk -F ' [/] ' ' . NR == $ 1.5 {인쇄 ""(NF의) $} ' 은 / etc / Passwd 파일
# 출력
LP nologin를 참고 복수 구분자 사이 사용 [(명령문 괄호) AWK 기본 세퍼레이터는 공간
사용 세 : AWK 변수 사용
AWK -VA = 2 -Vb = 3. ' NR 1 == {A + B} 출력한다. ' 등 / / Passwd 파일 # 출력
5 주 : AWK 도구 파일에 의존해야
넷째, 사용 내장 된 awk 변수와 연산자
운영자 | 기술 |
|| | 논리 또는 |
&& | 로직 및 |
~ ~! | 그리고 정규 표현식과 일치하지 않습니다 정규 표현식과 일치 |
<<=>> =! = == | 관계 연산자 |
공백 | 연결 |
+ - * / % | 모듈로 산술 |
++ - | 증가 또는 감소 |
$ | 필드 참조 |
에 | 배열 구성원 |
다음으로, yanshi.txt의 텍스트 콘텐츠를 사용
3 테스트의 nginx mysql을
4 MySQL의 고정 표시기 평방 AWK
이 테스트의
레디 스는 쉘 (22) 바람둥이, 파이썬, 자바
의 사용 : 행의 제 1 실시 예를 필터링은 3보다 큰
AWK ' $ (1)> 3 ' yanshi.txt
#输出 4 MySQL의 고정 표시기 평방 AWK 이 ' 테스트 사 (22)가 레디 스는 쉘 바람둥이, 파이썬, 자바
라인 필터 (3)는 첫 번째 열의 두 번째 열보다 큰 "MySQL의"같다 : 두 사용
AWK ' $ (1)> 3 && $ 2 == "MySQL은" ' yanshi.txt #输出 4 MySQL의 고정 표시기 평방 AWK
\ $ N | 현재 기록 n 번째 필드 |
FS | 필드 구분 |
NF | 필드 당 행 번호 |
NO | 행 번호가 읽은 레코드 수, |
OFS | 출력 레코드 구분 기호를 지정합니다 |
파일 이름 | 현재 파일 이름 |
IGNORECASE | 참이면 경우 매칭을 행하는 무시 |
대략 | 환경 변수 연관 배열 |
ERRNO | 마지막으로, 오류 시스템에 대한 설명 |
ORS | 출력 레코드 분리 (기본 개행이다). |
를 사용하여 별도의 출력 번호로 지정
AWK는 ' {$ 1, $ 2, $ 3 인쇄} ' OFS = " # " yanshi.txt의 #输出 3 # 시험 # nginx를 4 고정 표시기 # MySQL의 # 이 ' 의 # A # 테스트를 22 # 바람둥이 # 레디 스 #######을 ##################### AWK ' {$ 1, $ 2, $ 3를 인쇄} ' ORS = " # " yanshi.txt의 #输出结果 3 시험의 nginx # 4 MySQL의 고정 표시기 #이 ' 레디 스 # 바람둥이 사 시험 # 22
다섯, 정규 표현식에서 awk가
메타 문자 | 설명 |
^ | 헤더 일치하는 문자열에서 |
$ | 꼬리 문자열 일치에서 |
. | 모든 문자와 일치 |
* | 제로 또는 앞의 문자 이상을 일치 |
+ | 하나 앞의 문자 이상을 일치 |
? | 0 또는 1 주인공을 일치 |
[알파벳] | 사용자 정의 문자 세트 (ABC) 문자를 일치 |
[^ ABC] | 어떤 문자의 문자 세트 (ABC)를 지정하지 일치 |
[AZ] | 하나 개의 문자 Z 사이의 일치 |
A | B | A 또는 B와 일치 |
(AB) + | 匹配一个或多个ab的组合 |
\* | 配置星号本身 |
& | 用在替代串中,代表查找串中匹配到的内容 |
{m} | 指点匹配前面的字符m次 |
{m,} | 指定匹配前面的字符至少m次 |
{m,n} | 指定匹配前面的字符m~n次 |
~,!~ | 指定标量与正则表达式匹配或不匹配 |
可以查看 awk正则运算表达式详解
六、awk中的函数应用
应用一:求出已使用的内存的百分比
free | awk '/Mem/ {print int($3/$2*100)}' 13
应用二:生成一个随机数
echo "" | awk '{srand(); print int(rand()*10)}' 5 echo "" | awk '{srand(); print int(rand()*10)}' 6 #srand()将rand的函数种子,rand()返回任意数n,其中0<=n<1
应用三:时间函数
#systime()函数返回当前时间戳
echo "" | awk '{print systime()}' 1581650690 [root@fengling ~]# date -d@1581650690 Fri Feb 14 11:24:50 CST 2020 [root@fengling ~]# date Fri Feb 14 11:25:36 CST 2020
#strftime()函数格式化时间
echo "" | awk '{print strftime("%Y-%m-%d %H:%M:%s")}'
2020-02-14 11:28:1581650907
#mktime()将指定时间转换为时间戳
echo "" | awk '{print mktime(2018" "9" "10 " "10" "5" "20)}'
1536545120
date -d@1536545120
Mon Sep 10 10:05:20 CST 2018
七、awk的初始代码块与结束代码块
#要使用的文件log.txt
2019/03/12 21:23:25 [info] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [info] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.173 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=2d20b53c5&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.173 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=2d20b53c5&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.27 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=fa7c727f0&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.75 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=e7c5fbd34&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [info] client: 118.124.94.29 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=d4b3050af&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
#开头输出yi结尾输出三
echo "" | awk 'BEGIN {print"yi"} {print "er"} END{print "san"}' yi er san
实例一:打印出IP地址以及错误等级
要求格式:IP地址 错误等级
awk 'BEGIN{print "ip地址"" ""错误等级"} {print $5" "$3}' log.txt ip地址 错误等级 118.124.94.110 [info] 118.124.94.110 [error] 118.124.94.110 [error] 118.124.94.110 [info] 118.124.94.110 [error] 118.124.94.173 [error] 118.124.94.173 [error] 118.124.94.27 [error] 118.124.94.75 [error] 118.124.94.29 [info]
八、awk中的控制语句
实例一:if--else语句
#输出错误等级为error的IP地址 awk '{if($3=="[error]") print $5}' log.txt 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.173 118.124.94.173 118.124.94.27 118.124.94.75
#输出错误等级为error的IP地址,错误等级不为error输出错误等级
awk '{if($3=="[error]")print $5; else print $3}' log.txt
[info]
118.124.94.110
118.124.94.110
[info]
118.124.94.110
118.124.94.173
118.124.94.173
118.124.94.27
118.124.94.75
[info]
实例二:while语句
echo "" | awk -v i=1 '{while(i<10){print(i); i = i + 1}}' 1 2 3 4 5 6 7 8 9
实例三:for语句
echo "" | awk '{for(i=1;i<=3;i++) print i}' 1 2 3
九、awk中的数组
awk '{line[NR] = $5} END{for(i=NR;i>0;i--) print line[i]}' log.txt 118.124.94.29 118.124.94.75 118.124.94.27 118.124.94.173 118.124.94.173 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.110 #数组名[下标] = 值