인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

博客园_首页

게시글 없음

awk 명령 연습 (초 보 부터 고급 까지)
EricYeung · 2026-05-23 · via 博客园_首页

1) 환경 준비

테스트 파일 students. txt 를 만듭니다.

cat > students.txt << EOF
1|张三|男|90|85|92
2|李四|女|88|92|89
3|王五|男|95|88|94
4|赵六|女|92|96|91
5|孙七|男|87|84|86
EOF

data. txt 라는 또 다른 테스트 파일을 만듭니다.

cat > data.txt << EOF
apple 5 2.5
banana 3 1.2
orange 8 3.0
grape 12 4.5
EOF

2) 기초 연습
연습 1: 전체 행 인쇄

 #打印所有行
awk '{print}' students.txt

# 打印包含"女"的行
awk '/女/' students.txt

연습 2: 지정된 필드 인쇄

# 打印第1列和第3列(默认分隔符为空格或制表符)
awk '{print $1, $3}' data.txt

# 使用 -F 指定分隔符为 |
awk -F'|' '{print $2, $3}' students.txt

# 打印最后一列
awk '{print $NF}' data.txt

연습 3: 출력 서식 지정

# 格式化输出
awk -F'|' '{printf "姓名:%s,性别:%s\n", $2, $3}' students.txt

# 对齐输出
awk -F'|' '{printf "%-6s %-2s\n", $2, $3}' students.txt

3. 고급 연습
연습 4: 수학 연산

# 计算每行总和(data.txt第2列*第3列)
awk '{print $1, $2 * $3}' data.txt

# 计算学生平均分(students.txt第4-6列)
awk -F'|' '{sum=$4+$5+$6; avg=sum/3; print $2, "总分:"sum, "平均:"avg}' students.txt

연습 5: 변수 및 조건부 판단 사용

# 找出平均分>=90的学生
awk -F'|' '{avg=($4+$5+$6)/3; if(avg>=90) print $2, avg}' students.txt

# 多条件:女学生且平均分>90
awk -F'|' '{avg=($4+$5+$6)/3; if($3=="女" && avg>90) print $2, avg}' students.txt

# 使用 case 语句
awk -F'|' '{
    if($4>=90) grade="优秀"
    else if($4>=80) grade="良好"
    else grade="及格"
    print $2, $4, grade
}' students.txt

연습 6: BEGIN 및 END 블록

# 统计行数、总分数
awk -F'|' 'BEGIN{print "姓名\t总分"; sum=0} 
           {total=$4+$5+$6; print $2"\t"total; sum+=total} 
           END{print "总分数:"sum, "平均:"sum/NR}' students.txt

# 添加表头
awk 'BEGIN{print "====== 学生成绩表 ======"; print "姓名\t语文\t数学\t英语"}
     -F'|' '{print $2"\t"$4"\t"$5"\t"$6}
     END{print "====== 共"NR"人 ======"}' students.txt

4. 내장 변수 연습
연습 7: 일반적인 내장 변수

# NR: 行号,NF: 字段数
awk '{print "行号:"NR, "字段数:"NF, "内容:"$0}' data.txt

# 打印奇数行
awk 'NR%2==1' students.txt

# 打印第2-4行
awk 'NR>=2 && NR<=4' students.txt

# 打印字段数大于3的行
awk -F'|' 'NF>3' students.txt

5. 실전 종합훈련
연습 8: 텍스트 처리

# 去重
awk '!seen[$0]++' file.txt

# 统计重复行次数
awk '{count[$0]++} END{for(line in count) print count[line], line}' file.txt

# 按列求和
awk '{sum+=$2} END{print "总和:"sum, "平均值:"sum/NR}' data.txt

# 找出最大值
awk 'NR==1{max=$2} $2>max{max=$2} END{print "最大值:"max}' data.txt

연습 9: 복잡한 데이터 처리

# 分组统计(按性别统计平均分)
awk -F'|' '{sum[$3]+=$4+$5+$6; count[$3]++} 
           END{for(sex in sum) print sex, "平均分:"sum[sex]/count[sex]/3}' students.txt

# 输出到不同文件
awk -F'|' '{if($3=="男") print > "boys.txt"; else print > "girls.txt"}' students.txt

6. 종합적 적용
주제 1: 로그 분석
access. log 로그 파일이 있다고 가정합니다.

192.168.1.1 - - [01/Jan/2024:10:00:01] "GET /index.html" 200
192.168.1.2 - - [01/Jan/2024:10:00:02] "POST /api" 404
192.168.1.1 - - [01/Jan/2024:10:00:03] "GET /about" 200
# 统计每个IP的访问次数
awk '{count[$1]++} END{for(ip in count) print ip, count[ip]}' access.log

# 统计HTTP状态码分布
awk '{status=$NF; count[status]++} END{for(code in count) print code, count[code]}' access.log

제목 2: CSV 파일 처리

# 转换分隔符(| 转成逗号)
awk -F'|' -v OFS=',' '{$1=$1; print}' students.txt > students.csv

# 多文件处理
awk 'NR==FNR{arr[$1]=$2; next} {print $0, arr[$1]}' file1.txt file2.txt

7. 문법 참조 표

需求		awk命令
打印第n列	awk '{print $n}'
指定分隔符	awk -F','
行号		NR
字段数		NF
最后一列		$NF
条件过滤		awk '$3>90'
行范围		awk 'NR>=2 && NR<=5'
求和		awk '{sum+=$2} END{print sum}'
计数		awk '{count++} END{print count}'
去重		awk '!seen[$0]++'
格式化输出	awk '{printf "%-10s\n", $1}'