我们采用分阶段、逐步深入的方式,并且每个阶段都包含详细的知识点和英语学习内容。由于篇幅限制,我们将分多次输出。首先,我们制定一个为期6个月的详细学习计划,每个月为一个阶段,每个阶段包含4周,每周学习6天,每天学习4-5小时(包括技术学习和英语学习)。
第一阶段:Linux基础与英语入门(第1-2个月)
第1周:Linux安装与基本命令
技术学习:
学习Linux发行版选择,安装Ubuntu Desktop(双系统或虚拟机)。
学习终端使用:打开终端,了解shell,学习基本命令(ls, cd, pwd, mkdir, touch, cp, mv, rm, cat, less, head, tail)。
学习文件权限和所有权(chmod, chown, chgrp)。
学习文本编辑器(nano, vim基础)。
英语学习:
学习与上述命令相关的英语词汇和表达。
每天阅读一篇关于Linux基础的英文文章(例如来自Linux.com或Ubuntu官网)。
每天听一段关于Linux基础的英文视频(例如YouTube上的“Linux for beginners”)。
每日计划示例:
上午:学习2个命令,阅读相关英文文档。
下午:实践命令,写学习笔记(用英语)。
晚上:看英文视频,复习当天内容。
第2周:文件系统与文本处理
技术学习:
深入理解Linux文件系统结构(/, /home, /etc, /var, /usr, /tmp等)。
学习文件查找命令(find, locate)。
学习文本处理命令(grep, sed, awk基础)。
学习输入输出重定向和管道。
英语学习:
学习相关术语的英语表达。
尝试用英语解释每个命令的作用。
阅读英文man page。
每日计划示例:
上午:学习文件系统结构,阅读英文资料。
下午:练习find和grep命令,写一个简单的脚本(用英语注释)。
晚上:看英文视频,学习文本处理。
第3周:用户管理与进程管理
技术学习:
学习用户和组管理(useradd, usermod, userdel, groupadd, passwd)。
学习进程管理(ps, top, kill, jobs, fg, bg)。
学习服务管理(systemctl, service)。
学习计划任务(crontab, at)。
英语学习:
学习相关英语词汇。
阅读关于用户管理和进程管理的英文教程。
用英语写一个用户管理脚本。
每日计划示例:
上午:学习用户管理命令,阅读英文man page。
下午:练习进程管理,配置一个计划任务。
晚上:写学习笔记(英语),看相关英文视频。
第4周:软件包管理与网络基础
技术学习:
学习软件包管理(apt, dpkg, snap)。
学习网络配置命令(ifconfig, ip, ping, netstat, ss)。
学习SSH使用(ssh, scp, ssh-keygen)。
学习防火墙基础(ufw, iptables基础)。
英语学习:
学习相关英语词汇。
阅读关于软件包管理和网络的英文文章。
用英语记录网络配置步骤。
每日计划示例:
上午:学习软件包管理,用英语记录常用命令。
下午:配置网络,练习SSH连接。
晚上:看英文视频,复习本周内容。
第5-8周:巩固与项目实践
技术学习:
复习前4周内容,解决遇到的问题。
完成一个项目:搭建一个个人网站(LAMP栈)。
安装Apache,MySQL,PHP。
配置虚拟主机。
部署一个简单的网站。
英语学习:
用英语记录项目步骤。
阅读关于LAMP栈的英文教程。
尝试用英语解释你的项目。
每日计划示例:
上午:复习一个主题,阅读英文资料。
下午:进行项目实践,用英语写项目文档。
晚上:看英文视频,学习相关技术。
第二阶段:进阶运维与英语提升(第3-4个月)
第9-10周:脚本编程
技术学习:
学习Bash脚本编程:变量,条件判断,循环,函数。
学习Python基础:语法,数据类型,控制结构,函数,模块。
编写自动化脚本:系统监控,备份,用户管理。
英语学习:
学习编程相关的英语词汇。
阅读英文脚本和代码(例如GitHub上的项目)。
用英语写脚本注释和文档。
每日计划示例:
上午:学习Bash脚本,阅读英文教程。
下午:练习编写脚本,用英语注释。
晚上:学习Python基础,看英文视频。
第11-12周:网络服务与管理
技术学习:
学习DNS原理和配置(BIND或dnsmasq)。
学习Web服务器配置(Nginx,Apache虚拟主机,SSL证书)。
学习数据库管理(MySQL,PostgreSQL基础)。
学习邮件服务器基础(Postfix)。
英语学习:
学习相关英语词汇。
阅读英文配置文档。
用英语记录服务配置过程。
每日计划示例:
上午:学习DNS,阅读英文文档。
下午:配置Web服务器,用英语记录步骤。
晚上:看英文视频,学习数据库管理。
第13-14周:安全与监控
技术学习:
学习系统安全:SSH加固,防火墙(iptables进阶),SELinux/AppArmor。
学习监控工具:Nagios,Zabbix,Prometheus基础。
学习日志管理:rsyslog,logrotate。
英语学习:
学习安全与监控的英语词汇。
阅读英文安全指南(例如CIS基准)。
用英语写安全配置报告。
每日计划示例:
上午:学习系统安全,阅读英文指南。
下午:配置防火墙和监控,用英语记录。
晚上:看英文视频,学习日志管理。
第15-16周:项目实践
技术学习:
完成一个项目:搭建一个监控系统。
安装和配置Prometheus和Grafana。
监控服务器资源(CPU,内存,磁盘,网络)。
设置警报。
英语学习:
用英语写项目文档。
阅读英文监控教程。
尝试用英语解释监控原理。
每日计划示例:
上午:学习监控工具,阅读英文文档。
下午:搭建监控系统,用英语记录。
晚上:看英文视频,复习本周内容。
第三阶段:现代运维与英语流利(第5-6个月)
第17-18周:容器化技术
技术学习:
学习Docker:镜像,容器,仓库,网络,存储。
编写Dockerfile,构建镜像。
使用Docker Compose编排多容器应用。
英语学习:
学习容器技术的英语词汇。
阅读英文Docker文档。
用英语写Dockerfile和文档。
每日计划示例:
上午:学习Docker基础,阅读英文文档。
下午:练习Docker命令,构建镜像。
晚上:看英文视频,学习Docker Compose。
第19-20周:容器编排与云基础
技术学习:
学习Kubernetes基础:Pod,Deployment,Service,ConfigMap,Secret。
学习在本地搭建Kubernetes集群(minikube或k3s)。
学习云基础:AWS,Google Cloud,Azure的基本概念和服务(EC2,S3,VPC等)。
英语学习:
学习Kubernetes和云的英语词汇。
阅读英文Kubernetes文档。
用英语记录Kubernetes配置。
每日计划示例:
上午:学习Kubernetes概念,阅读英文文档。
下午:搭建本地集群,部署应用。
晚上:看英文视频,学习云基础。
第21-22周:配置管理与CI/CD
技术学习:
学习配置管理工具:Ansible,Puppet,Chef(重点Ansible)。
学习CI/CD概念和工具:Jenkins,GitLab CI。
编写Ansible playbook,配置服务器。
搭建一个简单的CI/CD流水线。
英语学习:
学习配置管理和CI/CD的英语词汇。
阅读英文Ansible和Jenkins文档。
用英语写playbook和流水线配置。
每日计划示例:
上午:学习Ansible,阅读英文文档。
下午:编写playbook,用英语注释。
晚上:看英文视频,学习CI/CD。
第23-24周:项目实践与求职准备
技术学习:
完成一个综合项目:使用Docker和Kubernetes部署一个微服务应用,并配置CI/CD流水线。
学习求职技能:简历编写,面试准备。
英语学习:
用英语写项目文档和简历。
模拟英语技术面试。
阅读英文技术博客,了解行业动态。
每日计划示例:
上午:进行项目实践,用英语记录。
下午:学习求职技能,修改简历。
晚上:模拟面试,看英文技术面试视频。
英语学习贯穿始终的建议:
每日听力:听技术相关的英语播客或视频(如Linux Action News,Arrested DevOps)。
每日阅读:阅读英文技术文档、博客、书籍。
每日写作:用英语写学习笔记、技术博客。
每日口语:尝试用英语复述今天学到的技术内容,或与语伴练习。
重要资源:
技术书籍:《The Linux Command Line》、《Unix and Linux System Administration Handbook》、《Docker Deep Dive》、《Kubernetes Up and Running》。
在线课程:Coursera,Udemy,edX上的相关课程。
文档:官方文档(Linux,Docker,Kubernetes,AWS等)。
社区:Reddit(r/linuxadmin,r/devops),Stack Overflow,GitHub。
由于篇幅限制,这里只提供了一个大纲。如果你需要更详细的每周甚至每日的学习内容,请告诉我,我可以为你展开。另外,请记住,学习过程中要不断实践,搭建自己的实验环境,并积极参与开源项目和社区。
Linux运维与专业英语完整学习体系(第三部分:脚本编程与自动化篇)
Day 19:文本处理工具实战(续)
技术学习部分
3. cut、paste、join工具(续)
bash
echo "提取特定列:"
cut -c1-3,8-20 fixed_width.txt
echo ""
echo "1.6 处理CSV文件:"
cat > data.csv << 'EOF'
ID,Name,Age,City,Salary
101,Alice,25,New York,75000
102,Bob,30,London,92000
103,Carol,28,Paris,68000
104,David,35,Tokyo,88000
EOF
echo "提取姓名和城市:"
cut -d, -f2,4 data.csv
echo ""
echo "1.7 与sort配合使用:"
echo "按姓名排序:"
cut -d, -f2 data.csv | sort
echo ""
echo "1.8 处理包含空格的字段:"
cat > spaces.txt << 'EOF'
John Doe;25;New York
Jane Smith;30;London
Bob Johnson;35;Tokyo
EOF
echo "使用不同分隔符:"
cut -d';' -f1,3 spaces.txt
echo ""
echo "1.9 实战示例 - 提取日志信息:"
cat > web_log.txt << 'EOF'
192.168.1.1 - - [15/Dec/2023:10:30:45 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [15/Dec/2023:10:31:15 +0800] "POST /api/login HTTP/1.1" 401 567
192.168.1.3 - - [15/Dec/2023:10:32:30 +0800] "GET /products HTTP/1.1" 200 8901
EOF
echo "提取IP地址:"
cut -d' ' -f1 web_log.txt
echo ""
echo "提取HTTP方法:"
cut -d'"' -f2 web_log.txt | cut -d' ' -f1
echo ""
echo "1.10 处理多字节字符:"
cat > utf8_data.txt << 'EOF'
1:张三:工程师:25
2:李四:设计师:28
3:王五:经理:32
EOF
echo "处理UTF-8数据:"
cut -d: -f2 utf8_data.txt
echo ""
echo "2. paste工具"
echo "======================================"
cat > names.txt << 'EOF'
Alice
Bob
Carol
David
Eva
EOF
cat > ages.txt << 'EOF'
25
30
28
35
27
EOF
cat > cities.txt << 'EOF'
New York
London
Paris
Tokyo
Berlin
EOF
echo "2.1 基本合并:"
paste names.txt ages.txt
echo ""
echo "2.2 自定义分隔符:"
paste -d', ' names.txt ages.txt cities.txt
echo ""
echo "2.3 垂直合并:"
paste -s names.txt ages.txt cities.txt
echo ""
echo "2.4 创建表格:"
paste -d' | ' - - - < names.txt
echo ""
echo "2.5 序列合并:"
echo -e "1\n2\n3\n4\n5" | paste -sd,
echo ""
echo "2.6 实际应用 - 创建CSV:"
paste -d',' names.txt ages.txt cities.txt > combined.csv
echo "生成的CSV文件:"
cat combined.csv
echo ""
echo "2.7 与cut配合使用:"
echo "重新排列列:"
cut -d, -f1,3 combined.csv | paste -d',' - <(cut -d, -f2 combined.csv)
echo ""
echo "3. join工具"
echo "======================================"
echo "3.1 基本连接:"
echo "员工数据:"
cat employees.txt
echo ""
echo "部门数据:"
cat departments.txt
echo ""
echo "按部门连接:"
join -t: -1 3 -2 1 <(sort -t: -k3 employees.txt) <(sort -t: -k1 departments.txt)
echo ""
echo "3.2 内连接:"
cat > dept_sorted.txt << 'EOF'
Design:Creative Suite:15
Engineering:Tech Building:50
Marketing:West Wing:25
Sales:Main Building:30
EOF
cat > emp_sorted.txt << 'EOF'
101:Alice Johnson:Engineering:75000
102:Bob Smith:Sales:92000
103:Carol Williams:Engineering:68000
104:David Brown:Marketing:55000
105:Eva Davis:Design:62000
EOF
echo "内连接结果:"
join -t: -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.3 左外连接:"
join -t: -a1 -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.4 右外连接:"
join -t: -a2 -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.5 全外连接:"
join -t: -a1 -a2 -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.6 指定输出格式:"
join -t: -1 3 -2 1 -o 1.1,1.2,1.3,2.2,1.4
emp_sorted.txt dept_sorted.txt |
awk -F: '{printf "%-3s %-15s %-12s %-15s %s\n", $1,$2,$3,$4,$5}'
echo ""
echo "3.7 处理大文件连接:"
创建测试数据
echo "生成测试数据..."
for i in {1..1000}; do
echo "user$i:dept$((RANDOM%10)):salary$((RANDOM*100))"
done > large_emp.txt
for i in {0..9}; do
echo "dept$i:location$i:size$((RANDOM*10))"
done > large_dept.txt
排序文件
sort -t: -k2 large_emp.txt > large_emp_sorted.txt
sort -t: -k1 large_dept.txt > large_dept_sorted.txt
echo "大文件连接测试:"
time join -t: -1 2 -2 1 large_emp_sorted.txt large_dept_sorted.txt > /dev/null
echo "连接完成"
echo ""
echo "4. 综合实战案例"
echo "======================================"
echo "4.1 员工信息报表生成:"
echo "生成员工详细信息报表..."
cat > report_script.sh << 'EOF'
#!/bin/bash
员工信息报表生成脚本
创建临时数据文件
cat > employees_full.txt << 'END'
101:Alice Johnson:Engineering:75000:alice@company.com:555-0101
102:Bob Smith:Sales:92000:bob@company.com:555-0102
103:Carol Williams:Engineering:68000:carol@company.com:555-0103
104:David Brown:Marketing:55000:david@company.com:555-0104
105:Eva Davis:Design:62000:eva@company.com:555-0105
106:Frank Miller:HR:48000:frank@company.com:555-0106
END
cat > departments_full.txt << 'END'
Engineering:Tech Building:3rd Floor:50:John Doe
Sales:Main Building:1st Floor:30:Jane Smith
Marketing:West Wing:2nd Floor:25:Bob Johnson
Design:Creative Suite:4th Floor:15:Alice Brown
HR:East Wing:2nd Floor:20:Carol Wilson
END
cat > salaries.txt << 'END'
101:75000:5000:80000
102:92000:7000:99000
103:68000:4500:72500
104:55000:3500:58500
105:62000:4000:66000
106:48000:3000:51000
END
echo "=== 员工综合信息报表 ==="
echo "生成时间: $(date)"
echo "================================================"
生成主报表
echo "员工基本信息:"
echo "ID 姓名 部门 薪资 邮箱"
echo "------------------------------------------------"
cut -d: -f1-4,5 employees_full.txt |
awk -F: '{printf "%-4s %-15s %-12s $%-7s %s\n", $1,$2,$3,$4,$5}' |
sort -k2
echo ""
部门统计
echo "部门统计信息:"
echo "部门 人数 平均薪资 最大薪资 最小薪资"
echo "--------------------------------------------------------"
join -t: -1 3 -2 1
<(sort -t: -k3 employees_full.txt)
<(sort -t: -k1 departments_full.txt) |
cut -d: -f1,4 |
awk -F: '{
dept[$1]++
total[$1] += $2
if($2 > max[$1] || max[$1] == "") max[$1] = $2
if($2 < min[$1] || min[$1] == "") min[$1] = $2
}
END {
for(d in dept) {
avg = total[d] / dept[d]
printf "%-12s %-6d $%-10.2f $%-9d $%-9d\n",
d, dept[d], avg, max[d], min[d]
}
}' | sort
echo ""
薪资分析
echo "薪资分析:"
echo "ID 姓名 基本薪资 奖金 总薪资"
echo "--------------------------------------------------"
join -t: -1 1 -2 1
<(cut -d: -f1,2 employees_full.txt | sort -t: -k1)
<(sort -t: -k1 salaries.txt) |
awk -F: '{
total = $3 + $4
printf "%-4s %-15s $%-10s $%-7s $%-8s\n",
$1, $2, $3, $4, total
basic_total += $3
bonus_total += $4
grand_total += total
count++
}
END {
print "--------------------------------------------------"
printf "总计: %d 名员工\n", count
printf "基本薪资总额: $%d\n", basic_total
printf "奖金总额: $%d\n", bonus_total
printf "薪资总额: $%d\n", grand_total
printf "平均总薪资: $%.2f\n", grand_total/count
}'
echo ""
清理临时文件
rm -f employees_full.txt departments_full.txt salaries.txt
EOF
chmod +x report_script.sh
./report_script.sh
echo ""
echo "4.2 日志分析系统:"
cat > log_analyzer.sh << 'EOF'
#!/bin/bash
日志分析系统
创建示例日志文件
cat > access_log.txt << 'END'
192.168.1.1 - alice [15/Dec/2023:10:30:45 +0800] "GET /index.html HTTP/1.1" 200 1234 "Mozilla/5.0"
192.168.1.2 - bob [15/Dec/2023:10:31:15 +0800] "POST /api/login HTTP/1.1" 401 567 "Chrome/91.0"
192.168.1.1 - alice [15/Dec/2023:10:32:30 +0800] "GET /products HTTP/1.1" 200 8901 "Firefox/89.0"
192.168.1.3 - carol [15/Dec/2023:10:33:45 +0800] "GET /about.html HTTP/1.1" 200 2345 "Safari/14.0"
192.168.1.2 - bob [15/Dec/2023:10:34:00 +0800] "GET /contact HTTP/1.1" 404 123 "Chrome/91.0"
192.168.1.4 - david [15/Dec/2023:10:35:15 +0800] "POST /api/data HTTP/1.1" 500 789 "Edge/92.0"
END
echo "=== Web访问日志分析报告 ==="
echo "分析时间: $(date)"
echo "日志文件: access_log.txt"
echo "总行数: $(wc -l < access_log.txt)"
echo "========================================"
1. IP地址统计
echo "1. IP访问统计:"
echo "IP地址 访问次数 总流量(B)"
echo "----------------------------------"
cut -d' ' -f1 access_log.txt | sort | uniq -c |
awk '{print $2, $1}' |
while read ip count; do
bytes=$(grep "^$ip " access_log.txt |
awk '{sum+=$10} END{print sum}')
printf "%-15s %-9d %-10d\n" $ip $count $bytes
done | sort -rnk2
echo ""
2. 状态码统计
echo "2. HTTP状态码统计:"
echo "状态码 次数 百分比"
echo "-----------------------"
awk '{print $9}' access_log.txt | sort | uniq -c |
awk -v total="$(wc -l < access_log.txt)" '{
percent = ($1/total)*100
printf "%-7s %-5d %-6.1f%%\n", $2, $1, percent
}'
echo ""
3. URL访问统计
echo "3. 最常访问的URL:"
echo "URL 访问次数"
echo "--------------------------------"
awk -F'"' '{print $2}' access_log.txt |
awk '{print $2}' |
sort | uniq -c |
sort -rn | head -5 |
awk '{printf "%-20s %-8d\n", $2, $1}'
echo ""
4. 用户代理统计
echo "4. 浏览器/客户端统计:"
echo "客户端 次数"
echo "--------------------------------"
awk -F'"' '{print $6}' access_log.txt |
sort | uniq -c |
sort -rn |
awk '{printf "%-20s %-6d\n", $2, $1}'
echo ""
5. 时间分析
echo "5. 按小时访问统计:"
echo "小时 访问次数"
echo "--------------"
awk '{print $4}' access_log.txt |
cut -d: -f2 |
sort | uniq -c |
awk '{printf "%-6s %-8d\n", $2, $1}'
echo ""
清理
rm -f access_log.txt
EOF
chmod +x log_analyzer.sh
./log_analyzer.sh
echo ""
echo "4.3 数据转换和清理:"
cat > data_cleaner.sh << 'EOF'
#!/bin/bash
数据清理和转换工具
创建脏数据
cat > dirty_data.csv << 'END'
ID,Name,Age,City,Salary,Department
101,"John Doe",25,New York,75000,Engineering
102,"Jane Smith",,London,92000,Sales
103,"Bob Johnson",35,Tokyo,68000,
104,"Alice Brown",28,"Paris, France",62000,Design
105,"Charlie, Lee",30,Beijing,,Marketing
106,"David Wang",42,"San Francisco, CA",88000,Engineering
END
echo "原始数据:"
cat dirty_data.csv
echo ""
echo "========================================"
echo "数据清理过程:"
echo ""
1. 修复缺失值
echo "1. 处理缺失值:"
echo "发现缺失值 -> 填充默认值"
awk -F, '
BEGIN {OFS=","}
{
# 检查并修复年龄
if ($3 == "" || $3 == " ") $3 = "30"
# 检查并修复薪资
if ($5 == "" || $5 == " ") $5 = "65000"
# 检查并修复部门
if ($6 == "" || $6 == " ") $6 = "Unknown"
print $0
}' dirty_data.csv > cleaned_step1.csv
echo "第一步清理完成"
echo ""
2. 处理包含逗号的字段
echo "2. 处理包含特殊字符的字段:"
echo "修复包含逗号的姓名和城市字段"
cat cleaned_step1.csv |
awk '
BEGIN {FPAT = "([^,]*)|("[^\"]+")"; OFS=","}
{
# 清理引号
for(i=1; i<=NF; i++) {
gsub(/^"|"$/, "", $i)
}
print $0
}' > cleaned_step2.csv
echo "第二步清理完成"
echo ""
3. 格式化输出
echo "3. 格式化最终数据:"
echo "ID 姓名 年龄 城市 薪资 部门"
echo "------------------------------------------------------------"
awk -F, 'NR>1 {
printf "%-4s %-15s %-4s %-18s $%-7s %s\n",
$1, $2, $3, $4, $5, $6
}' cleaned_step2.csv
echo ""
4. 生成报告
echo "4. 数据质量报告:"
echo "总记录数: $(tail -n +2 cleaned_step2.csv | wc -l)"
echo "有效年龄记录: $(awk -F, 'NR>1 && $3 != "" && $3 != " " {count++} END{print count}' cleaned_step2.csv)"
echo "有效薪资记录: $(awk -F, 'NR>1 && $5 != "" && $5 != " " {count++} END{print count}' cleaned_step2.csv)"
echo "有效部门记录: $(awk -F, 'NR>1 && $6 != "" && $6 != " " {count++} END{print count}' cleaned_step2.csv)"
echo ""
清理临时文件
rm -f dirty_data.csv cleaned_step1.csv cleaned_step2.csv
EOF
chmod +x data_cleaner.sh
./data_cleaner.sh
echo ""
echo "5. 性能优化技巧"
echo "======================================"
创建大文件测试性能
echo "创建性能测试数据..."
time (
for i in {1..100000}; do
echo "user$((RANDOM%1000)):dept$((RANDOM%10)):salary$((RANDOM*100)):city$((RANDOM%20))"
done > perf_test.txt
)
echo "5.1 cut性能测试:"
echo "使用cut提取字段:"
time cut -d: -f2 perf_test.txt > /dev/null
echo ""
echo "使用awk提取字段:"
time awk -F: '{print $2}' perf_test.txt > /dev/null
echo ""
echo "5.2 sort性能优化:"
echo "默认排序:"
time sort perf_test.txt > /dev/null
echo ""
echo "指定缓冲区大小:"
time sort -S 100M perf_test.txt > /dev/null
echo ""
echo "使用临时目录:"
time sort -T /tmp perf_test.txt > /dev/null
echo ""
echo "5.3 join性能优化:"
准备排序文件
sort -t: -k2 perf_test.txt > perf_test_sorted.txt
cat > dept_lookup.txt << 'END'
dept0:Department 0:Building A
dept1:Department 1:Building B
dept2:Department 2:Building C
dept3:Department 3:Building D
dept4:Department 4:Building E
dept5:Department 5:Building F
dept6:Department 6:Building G
dept7:Department 7:Building H
dept8:Department 8:Building I
dept9:Department 9:Building J
END
sort -t: -k1 dept_lookup.txt > dept_lookup_sorted.txt
echo "连接大文件:"
time join -t: -1 2 -2 1 perf_test_sorted.txt dept_lookup_sorted.txt > /dev/null
echo ""
echo "5.4 内存使用优化:"
echo "处理大文件时使用管道:"
time cut -d: -f1,2 perf_test.txt | sort | uniq -c > /dev/null
echo ""
清理测试文件
rm -f perf_test.txt perf_test_sorted.txt dept_lookup.txt dept_lookup_sorted.txt
echo "6. 错误处理"
echo "======================================"
echo "6.1 处理不存在的字段:"
echo "尝试提取不存在的字段:"
echo "test:line" | cut -d: -f5 2>&1 || true
echo ""
echo "6.2 处理空文件:"
touch empty.txt
echo "处理空文件:"
cut -d: -f1 empty.txt 2>&1 || echo "空文件,无输出"
echo ""
echo "6.3 处理格式错误:"
echo "处理格式不一致的数据:"
echo -e "field1:field2\nfield1,field2\nfield1 field2" | cut -d: -f2 2>&1
echo ""
echo "6.4 处理权限问题:"
echo "尝试读取无权限文件:"
touch no_read.txt
chmod 000 no_read.txt
cut -d: -f1 no_read.txt 2>&1 | head -1
chmod 644 no_read.txt
rm -f no_read.txt
echo ""
echo "7. 实用脚本示例"
echo "======================================"
echo "7.1 批量重命名工具:"
cat > batch_rename.sh << 'EOF'
#!/bin/bash
批量重命名工具
创建测试文件
mkdir -p test_files
cd test_files
for i in {1..5}; do
echo "Content of file $i" > "old_name_$i.txt"
done
echo "重命名前:"
ls -1 *.txt
echo ""
批量重命名
counter=1
for file in *.txt; do
new_name="document_$(printf "%03d" $counter).txt"
echo "重命名: $file -> $new_name"
mv "$file" "$new_name"
((counter++))
done
echo ""
echo "重命名后:"
ls -1 *.txt
清理
cd ..
rm -rf test_files
EOF
chmod +x batch_rename.sh
echo "执行批量重命名示例:"
./batch_rename.sh
echo ""
echo "7.2 系统监控脚本:"
cat > system_monitor.sh << 'EOF'
#!/bin/bash
系统监控脚本
echo "=== 系统监控报告 ==="
echo "生成时间: $(date)"
echo "主机名: $(hostname)"
echo "运行时间: $(uptime -p)"
echo "========================================"
CPU使用率
echo "1. CPU使用率:"
top -bn1 | grep "Cpu(s)" |
awk '{printf "用户: %.1f%% 系统: %.1f%% 空闲: %.1f%%\n", $2, $4, $8}'
echo ""
内存使用
echo "2. 内存使用:"
free -h | awk '
NR==2 {printf "总量: %s 已用: %s 空闲: %s 使用率: %.1f%%\n",
$2, $3, $4, ($3/$2)*100}'
echo ""
磁盘使用
echo "3. 磁盘使用率:"
df -h | awk '
NR>1 && $5+0 > 80 {
printf "警告: %s 使用率 %s (可用: %s)\n", $1, $5, $4
}'
echo ""
进程监控
echo "4. 内存使用最高的5个进程:"
ps aux --sort=-%mem | awk '
NR<=6 {
if(NR==1) print "USER PID %CPU %MEM COMMAND"
else printf "%-8s %6s %6.1f %6.1f %s\n", $1, $2, $3, $4, $11
}'
echo ""
网络连接
echo "5. 网络连接统计:"
ss -tun | awk '
/^tcp/ {state[$2]++}
END {
print "TCP连接状态:"
for(s in state) {
printf " %-12s: %d\n", s, state[s]
}
}'
echo ""
登录用户
echo "6. 当前登录用户:"
who | awk '{print $1}' | sort | uniq -c |
awk '{printf "用户 %s: %d 个会话\n", $2, $1}'
EOF
chmod +x system_monitor.sh
echo "执行系统监控:"
./system_monitor.sh
echo ""
清理脚本文件
rm -f report_script.sh log_analyzer.sh data_cleaner.sh
batch_rename.sh system_monitor.sh employees.txt
departments.txt projects.txt fixed_width.txt
data.csv spaces.txt web_log.txt utf8_data.txt
names.txt ages.txt cities.txt combined.csv
emp_sorted.txt dept_sorted.txt empty.txt
echo "=== cut、paste、join工具深度掌握完成 ==="
英语学习部分
- 专业术语学习
bash
#!/bin/bash
english_terms.sh
echo "=== 文本处理工具专业英语词汇 ==="
echo ""
echo "1. 核心工具术语:"
echo "========================================"
cat << 'EOF'
cut - Extract sections from lines of files
- 从文件行中提取部分内容
paste - Merge lines of files
- 合并文件行
join - Join lines of two files on a common field
- 基于公共字段连接两个文件的行
sort - Sort lines of text files
- 对文本文件的行进行排序
awk - Pattern scanning and processing language
- 模式扫描和处理语言
sed - Stream editor for filtering and transforming text
- 用于过滤和转换文本的流编辑器
grep - Print lines that match patterns
- 打印匹配模式的行
EOF
echo ""
echo "2. 常用参数术语:"
echo "========================================"
cat << 'EOF'
-d, --delimiter - Specify field delimiter
- 指定字段分隔符
-f, --fields - Select only these fields
- 仅选择这些字段
-s, --serial - Paste one file at a time
- 每次粘贴一个文件
-u, --unique - Output only unique lines
- 仅输出唯一行
-n, --numeric - Compare according to string numerical value
- 根据字符串数值比较
-r, --reverse - Reverse the result of comparisons
- 反转比较结果
-t, --field-separator - Specify input field separator
- 指定输入字段分隔符
-o, --output - Specify output format
- 指定输出格式
EOF
echo ""
echo "3. 数据处理概念:"
echo "========================================"
cat << 'EOF'
Field - A unit of data in a record
- 记录中的数据单元
Delimiter - A character that separates fields
- 分隔字段的字符
Record - A complete set of related data fields
- 一组完整的相关数据字段
CSV (Comma-Separated Values) - Data format using commas as delimiters
- 使用逗号作为分隔符的数据格式
TSV (Tab-Separated Values) - Data format using tabs as delimiters
- 使用制表符作为分隔符的数据格式
Parsing - Analyzing text to extract structured information
- 分析文本以提取结构化信息
Filtering - Selecting specific data based on criteria
- 根据条件选择特定数据
Transformation - Changing data from one format to another
- 将数据从一种格式转换为另一种格式
Concatenation - Combining strings or data end-to-end
- 将字符串或数据首尾相连
Joining - Combining data from different sources based on keys
- 基于键合并来自不同源的数据
EOF
echo ""
echo "4. 实用表达句式:"
echo "========================================"
cat << 'EOF'
-
To extract specific columns from a file:
- 从文件中提取特定列:
Example: Use cut -d',' -f1,3 data.csv
-
To merge multiple files side by side:
- 并排合并多个文件:
Example: paste file1.txt file2.txt
-
To join two files based on a common field:
- 基于公共字段连接两个文件:
Example: join -t':' file1.txt file2.txt
-
To sort data numerically in reverse order:
- 按数值逆序排序数据:
Example: sort -nr data.txt
-
To filter lines containing a pattern:
- 过滤包含模式的行:
Example: grep "error" logfile.txt
-
To perform complex text transformations:
- 执行复杂的文本转换:
Example: awk '{print $1, $3}' data.txt
-
To remove duplicate entries:
- 删除重复条目:
Example: sort file.txt | uniq
-
To count occurrences of each line:
- 计算每行的出现次数:
Example: sort file.txt | uniq -c
EOF
echo ""
echo "5. 常见错误处理:"
echo "========================================"
cat << 'EOF'
-
"No such file or directory"
-
"Invalid argument" or "Illegal option"
- 检查命令参数语法
- 查看帮助文档:command --help
-
"Syntax error" in awk/sed
-
"Memory exhausted" when processing large files
-
"Permission denied"
- 检查文件权限:ls -l filename
- 使用sudo或联系系统管理员
-
"Field number is out of range"
-
"Join failed" due to unsorted files
- 确保输入文件已按连接键排序
- 使用sort命令预先排序
-
"Disk space exhausted"
- 清理临时文件
- 检查磁盘使用情况:df -h
EOF
echo ""
echo "6. 面试常见问题:"
echo "========================================"
cat << 'EOF'
-
Q: What is the difference between cut and awk?
A: cut is simpler and faster for extracting fixed columns,
while awk is more powerful for complex text processing.
-
Q: How would you merge multiple CSV files?
A: I would use paste for side-by-side merging or cat for
end-to-end merging, depending on the requirement.
-
Q: When would you use join vs awk for merging files?
A: join is more efficient for simple field-based joins,
while awk provides more flexibility for complex logic.
-
Q: How do you handle large files that don't fit in memory?
A: Use streaming tools like sed, awk, or split the file
and process in chunks.
-
Q: What's the difference between sort | uniq and sort -u?
A: sort -u is generally faster as it's a single command,
but sort | uniq is more readable in pipelines.
-
Q: How would you extract data from JSON or XML files?
A: For simple cases, use tools like jq for JSON or
xmlstarlet for XML. For complex cases, consider Python.
-
Q: What are some performance optimization techniques?
A: Use appropriate buffer sizes, avoid unnecessary
intermediate files, and use built-in functions.
-
Q: How do you debug text processing pipelines?
A: Use tee to check intermediate output, add echo
statements, and test each command separately.
EOF
echo ""
echo "7. 实用文档阅读:"
echo "========================================"
echo "阅读并理解以下man page摘要:"
echo ""
cat << 'EOF'
CUT(1) - extract columns from files
SYNOPSIS
cut OPTION... [FILE]...
DESCRIPTION
Print selected parts of lines from each FILE to standard output.
Mandatory arguments to long options are mandatory for short options too.
-b, --bytes=LIST select only these bytes
-c, --characters=LIST select only these characters
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter
-f, --fields=LIST select only these fields; also print any line
that contains no delimiter character, unless
the -s option is specified
-n with -b: don't split multibyte characters
--complement complement the set of selected bytes, characters
or fields
-s, --only-delimited do not print lines not containing delimiters
--output-delimiter=STRING use STRING as the output delimiter
the default is to use the input delimiter
EOF
echo ""
echo "8. 实践练习:"
echo "========================================"
cat << 'EOF'
练习1:解析Apache访问日志
目标:提取IP地址、状态码和访问量
命令:awk '{print $1, $9}' access.log | sort | uniq -c | sort -rn
练习2:合并两个数据集
目标:基于员工ID合并工资和部门信息
命令:join -t',' -1 1 -2 1 salaries.csv departments.csv
练习3:数据清洗
目标:清理包含空值和格式问题的CSV文件
命令:awk -F, 'BEGIN {OFS=","} {if($3=="") $3="N/A"; print}' data.csv
练习4:生成报表
目标:创建格式化的系统资源报表
命令:df -h | awk '{printf "%-20s %-10s %-10s %-10s\n", $1,$2,$3,$5}'
练习5:监控脚本
目标:编写监控磁盘使用率的脚本
命令:df -h | awk '$5+0 > 80 {print "警告: " $1 " 使用率 " $5}'
EOF
echo ""
echo "=== 英语学习部分完成 ==="
每日实践任务
bash
#!/bin/bash
daily_practice.sh
echo "=== Day 19 每日实践任务 ==="
echo ""
echo "任务1:文本处理基础"
echo "========================================"
cat << 'EOF'
-
创建一个包含以下内容的文件 employees.csv:
ID,Name,Age,Department,Salary
101,John Smith,30,Engineering,75000
102,Jane Doe,28,Marketing,65000
103,Bob Johnson,35,Sales,82000
104,Alice Brown,32,Engineering,78000
-
使用cut提取姓名和部门:
cut -d',' -f2,4 employees.csv
-
使用awk计算平均年龄和平均工资:
awk -F, 'NR>1 {age+=$3; salary+=$5; count++}
END {print "平均年龄:", age/count, "平均工资:", salary/count}' employees.csv
-
使用sort按工资降序排序:
sort -t',' -k5nr employees.csv
EOF
echo ""
echo "任务2:数据合并"
echo "========================================"
cat << 'EOF'
-
创建部门信息文件 departments.csv:
Department,Location,Manager
Engineering,Building A,David Chen
Marketing,Building B,Sarah Wang
Sales,Building C,Michael Liu
-
使用join合并员工和部门信息:
join -t',' -1 4 -2 1 <(sort -t',' -k4 employees.csv) <(sort -t',' -k1 departments.csv)
-
使用paste创建员工信息卡:
paste -d'\n' <(cut -d',' -f2 employees.csv)
<(cut -d',' -f5 employees.csv) |
awk 'NR%2{printf "姓名: %-15s", $0; next} {print " 工资: $" $0}'
EOF
echo ""
echo "任务3:日志分析实战"
echo "========================================"
cat << 'EOF'
-
分析nginx访问日志(模拟数据):
cat > access.log << 'END'
192.168.1.1 - - [15/Dec/2023:10:30:45 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [15/Dec/2023:10:31:15 +0800] "POST /api/login HTTP/1.1" 401 567
192.168.1.1 - - [15/Dec/2023:10:32:30 +0800] "GET /products HTTP/1.1" 200 8901
END
-
统计IP访问次数:
awk '{print $1}' access.log | sort | uniq -c | sort -rn
-
统计HTTP状态码:
awk '{print $9}' access.log | sort | uniq -c
-
提取访问量最高的URL:
awk -F'"' '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -rn
EOF
echo ""
echo "任务4:系统监控脚本"
echo "========================================"
cat << 'EOF'
编写一个系统监控脚本,包含以下功能:
- 检查磁盘使用率超过80%的分区
- 显示内存使用情况
- 列出CPU使用率最高的5个进程
- 统计网络连接状态
- 检查系统负载
示例脚本框架:
#!/bin/bash
echo "=== 系统监控报告 ==="
echo "时间: $(date)"
echo "---"
echo "磁盘使用:"
df -h | awk '$5+0 > 80'
echo "---"
echo "内存使用:"
free -h
echo "---"
echo "进程监控:"
ps aux --sort=-%cpu | head -6
EOF
echo ""
echo "任务5:英语练习"
echo "========================================"
cat << 'EOF'
-
阅读并翻译以下awk命令:
awk 'BEGIN {FS=":"; OFS="\t"} {print $1, $3, $5}' /etc/passwd
-
用英语解释sort命令的以下参数:
-n, -r, -k, -t
-
描述如何使用join命令合并两个CSV文件
-
解释以下管道命令的作用:
cat logfile | grep "ERROR" | cut -d' ' -f1-3 | sort | uniq -c
-
用英语写一个简单的文本处理脚本注释
EOF
echo ""
echo "任务6:性能优化"
echo "========================================"
cat << 'EOF'
处理一个大型日志文件(假设有100万行):
-
使用split分割文件:
split -l 100000 large.log chunk_
-
并行处理每个分块:
for file in chunk_*; do
process_chunk "$file" &
done
wait
-
合并结果:
cat result_* > final_result.txt
-
清理临时文件:
rm -f chunk_* result_*
优化技巧:
- 使用适当的分隔符避免转义
- 使用内置函数而不是shell循环
- 避免不必要的中间文件
- 使用管道连接处理步骤
EOF
echo ""
echo "任务7:错误处理实践"
echo "========================================"
cat << 'EOF'
编写一个健壮的文本处理脚本,包含:
- 检查文件是否存在
- 检查文件权限
- 处理空文件
- 处理格式错误
- 记录处理日志
示例:
#!/bin/bash
LOG_FILE="process.log"
process_file() {
local file="$1"
if [[ ! -f "$file" ]]; then
echo "$(date): 文件不存在: $file" >> "$LOG_FILE"
return 1
fi
if [[ ! -r "$file" ]]; then
echo "$(date): 无读取权限: $file" >> "$LOG_FILE"
return 1
fi
if [[ ! -s "$file" ]]; then
echo "$(date): 空文件: $file" >> "$LOG_FILE"
return 0
fi
# 实际处理逻辑
awk -F, '{print $1, $2}' "$file"
}
EOF
echo ""
echo "=== 今日实践任务完成 ==="
echo "建议:每个任务完成后,用英语写下遇到的问题和解决方案"
这个完整的Day 19学习计划包含了:
技术深度:awk、sort、cut、paste、join工具的全面掌握
英语学习:专业术语、实用表达、面试问题、文档阅读
实践任务:从基础到高级的实战练习
性能优化:处理大文件的技巧和方法
错误处理:健壮脚本的编写技巧
按照这个计划,学习者可以系统地掌握Linux文本处理的核心工具,同时提升相关的专业英语能力。
请继续
Linux运维与专业英语完整学习体系(第三部分:脚本编程与自动化篇)
Day 20:Shell脚本编程高级技巧
技术学习部分
- Shell脚本调试与优化
bash
#!/bin/bash
shell_debugging.sh
====================
Shell脚本调试与优化
====================
echo "=== Shell脚本调试与优化 ==="
echo "1. 调试技术"
echo "======================================"
1.1 基本调试选项
cat > debug_demo.sh << 'EOF'
#!/bin/bash
调试演示脚本
启用调试选项
set -x # 显示执行的命令
set -e # 出错即退出
set -u # 使用未定义变量时报错
set -o pipefail # 管道命令失败时整个命令失败
echo "=== 调试演示开始 ==="
定义变量
filename="test.txt"
count=5
创建测试文件
for i in $(seq 1 $count); do
echo "Line $i: Sample data $(date)" >> $filename
done
处理文件
wc -l $filename
echo "文件行数统计完成"
故意制造错误
non_existent_cmd
echo "这行不会执行"
清理
rm -f $filename
echo "=== 调试演示结束 ==="
EOF
chmod +x debug_demo.sh
Linux运维与专业英语完整学习体系(第三部分:脚本编程与自动化篇)
Day 24:容器编排与Kubernetes基础
技术学习部分
- Kubernetes核心概念与架构
请从day1开始,每天讲解需要详细,做为一个新人,需要完整的,详细的介绍给新人。
另外还需要补充实际生成环境的操作方式、生产环境的行为和数据案例等。
我们采用分阶段、逐步深入的方式,并且每个阶段都包含详细的知识点和英语学习内容。由于篇幅限制,我们将分多次输出。首先,我们制定一个为期6个月的详细学习计划,每个月为一个阶段,每个阶段包含4周,每周学习6天,每天学习4-5小时(包括技术学习和英语学习)。
第一阶段:Linux基础与英语入门(第1-2个月)
第1周:Linux安装与基本命令
技术学习:
学习Linux发行版选择,安装Ubuntu Desktop(双系统或虚拟机)。
学习终端使用:打开终端,了解shell,学习基本命令(ls, cd, pwd, mkdir, touch, cp, mv, rm, cat, less, head, tail)。
学习文件权限和所有权(chmod, chown, chgrp)。
学习文本编辑器(nano, vim基础)。
英语学习:
学习与上述命令相关的英语词汇和表达。
每天阅读一篇关于Linux基础的英文文章(例如来自Linux.com或Ubuntu官网)。
每天听一段关于Linux基础的英文视频(例如YouTube上的“Linux for beginners”)。
每日计划示例:
上午:学习2个命令,阅读相关英文文档。
下午:实践命令,写学习笔记(用英语)。
晚上:看英文视频,复习当天内容。
第2周:文件系统与文本处理
技术学习:
深入理解Linux文件系统结构(/, /home, /etc, /var, /usr, /tmp等)。
学习文件查找命令(find, locate)。
学习文本处理命令(grep, sed, awk基础)。
学习输入输出重定向和管道。
英语学习:
学习相关术语的英语表达。
尝试用英语解释每个命令的作用。
阅读英文man page。
每日计划示例:
上午:学习文件系统结构,阅读英文资料。
下午:练习find和grep命令,写一个简单的脚本(用英语注释)。
晚上:看英文视频,学习文本处理。
第3周:用户管理与进程管理
技术学习:
学习用户和组管理(useradd, usermod, userdel, groupadd, passwd)。
学习进程管理(ps, top, kill, jobs, fg, bg)。
学习服务管理(systemctl, service)。
学习计划任务(crontab, at)。
英语学习:
学习相关英语词汇。
阅读关于用户管理和进程管理的英文教程。
用英语写一个用户管理脚本。
每日计划示例:
上午:学习用户管理命令,阅读英文man page。
下午:练习进程管理,配置一个计划任务。
晚上:写学习笔记(英语),看相关英文视频。
第4周:软件包管理与网络基础
技术学习:
学习软件包管理(apt, dpkg, snap)。
学习网络配置命令(ifconfig, ip, ping, netstat, ss)。
学习SSH使用(ssh, scp, ssh-keygen)。
学习防火墙基础(ufw, iptables基础)。
英语学习:
学习相关英语词汇。
阅读关于软件包管理和网络的英文文章。
用英语记录网络配置步骤。
每日计划示例:
上午:学习软件包管理,用英语记录常用命令。
下午:配置网络,练习SSH连接。
晚上:看英文视频,复习本周内容。
第5-8周:巩固与项目实践
技术学习:
复习前4周内容,解决遇到的问题。
完成一个项目:搭建一个个人网站(LAMP栈)。
安装Apache,MySQL,PHP。
配置虚拟主机。
部署一个简单的网站。
英语学习:
用英语记录项目步骤。
阅读关于LAMP栈的英文教程。
尝试用英语解释你的项目。
每日计划示例:
上午:复习一个主题,阅读英文资料。
下午:进行项目实践,用英语写项目文档。
晚上:看英文视频,学习相关技术。
第二阶段:进阶运维与英语提升(第3-4个月)
第9-10周:脚本编程
技术学习:
学习Bash脚本编程:变量,条件判断,循环,函数。
学习Python基础:语法,数据类型,控制结构,函数,模块。
编写自动化脚本:系统监控,备份,用户管理。
英语学习:
学习编程相关的英语词汇。
阅读英文脚本和代码(例如GitHub上的项目)。
用英语写脚本注释和文档。
每日计划示例:
上午:学习Bash脚本,阅读英文教程。
下午:练习编写脚本,用英语注释。
晚上:学习Python基础,看英文视频。
第11-12周:网络服务与管理
技术学习:
学习DNS原理和配置(BIND或dnsmasq)。
学习Web服务器配置(Nginx,Apache虚拟主机,SSL证书)。
学习数据库管理(MySQL,PostgreSQL基础)。
学习邮件服务器基础(Postfix)。
英语学习:
学习相关英语词汇。
阅读英文配置文档。
用英语记录服务配置过程。
每日计划示例:
上午:学习DNS,阅读英文文档。
下午:配置Web服务器,用英语记录步骤。
晚上:看英文视频,学习数据库管理。
第13-14周:安全与监控
技术学习:
学习系统安全:SSH加固,防火墙(iptables进阶),SELinux/AppArmor。
学习监控工具:Nagios,Zabbix,Prometheus基础。
学习日志管理:rsyslog,logrotate。
英语学习:
学习安全与监控的英语词汇。
阅读英文安全指南(例如CIS基准)。
用英语写安全配置报告。
每日计划示例:
上午:学习系统安全,阅读英文指南。
下午:配置防火墙和监控,用英语记录。
晚上:看英文视频,学习日志管理。
第15-16周:项目实践
技术学习:
完成一个项目:搭建一个监控系统。
安装和配置Prometheus和Grafana。
监控服务器资源(CPU,内存,磁盘,网络)。
设置警报。
英语学习:
用英语写项目文档。
阅读英文监控教程。
尝试用英语解释监控原理。
每日计划示例:
上午:学习监控工具,阅读英文文档。
下午:搭建监控系统,用英语记录。
晚上:看英文视频,复习本周内容。
第三阶段:现代运维与英语流利(第5-6个月)
第17-18周:容器化技术
技术学习:
学习Docker:镜像,容器,仓库,网络,存储。
编写Dockerfile,构建镜像。
使用Docker Compose编排多容器应用。
英语学习:
学习容器技术的英语词汇。
阅读英文Docker文档。
用英语写Dockerfile和文档。
每日计划示例:
上午:学习Docker基础,阅读英文文档。
下午:练习Docker命令,构建镜像。
晚上:看英文视频,学习Docker Compose。
第19-20周:容器编排与云基础
技术学习:
学习Kubernetes基础:Pod,Deployment,Service,ConfigMap,Secret。
学习在本地搭建Kubernetes集群(minikube或k3s)。
学习云基础:AWS,Google Cloud,Azure的基本概念和服务(EC2,S3,VPC等)。
英语学习:
学习Kubernetes和云的英语词汇。
阅读英文Kubernetes文档。
用英语记录Kubernetes配置。
每日计划示例:
上午:学习Kubernetes概念,阅读英文文档。
下午:搭建本地集群,部署应用。
晚上:看英文视频,学习云基础。
第21-22周:配置管理与CI/CD
技术学习:
学习配置管理工具:Ansible,Puppet,Chef(重点Ansible)。
学习CI/CD概念和工具:Jenkins,GitLab CI。
编写Ansible playbook,配置服务器。
搭建一个简单的CI/CD流水线。
英语学习:
学习配置管理和CI/CD的英语词汇。
阅读英文Ansible和Jenkins文档。
用英语写playbook和流水线配置。
每日计划示例:
上午:学习Ansible,阅读英文文档。
下午:编写playbook,用英语注释。
晚上:看英文视频,学习CI/CD。
第23-24周:项目实践与求职准备
技术学习:
完成一个综合项目:使用Docker和Kubernetes部署一个微服务应用,并配置CI/CD流水线。
学习求职技能:简历编写,面试准备。
英语学习:
用英语写项目文档和简历。
模拟英语技术面试。
阅读英文技术博客,了解行业动态。
每日计划示例:
上午:进行项目实践,用英语记录。
下午:学习求职技能,修改简历。
晚上:模拟面试,看英文技术面试视频。
英语学习贯穿始终的建议:
每日听力:听技术相关的英语播客或视频(如Linux Action News,Arrested DevOps)。
每日阅读:阅读英文技术文档、博客、书籍。
每日写作:用英语写学习笔记、技术博客。
每日口语:尝试用英语复述今天学到的技术内容,或与语伴练习。
重要资源:
技术书籍:《The Linux Command Line》、《Unix and Linux System Administration Handbook》、《Docker Deep Dive》、《Kubernetes Up and Running》。
在线课程:Coursera,Udemy,edX上的相关课程。
文档:官方文档(Linux,Docker,Kubernetes,AWS等)。
社区:Reddit(r/linuxadmin,r/devops),Stack Overflow,GitHub。
由于篇幅限制,这里只提供了一个大纲。如果你需要更详细的每周甚至每日的学习内容,请告诉我,我可以为你展开。另外,请记住,学习过程中要不断实践,搭建自己的实验环境,并积极参与开源项目和社区。
Linux运维与专业英语完整学习体系(第三部分:脚本编程与自动化篇)
Day 19:文本处理工具实战(续)
技术学习部分
3. cut、paste、join工具(续)
bash
echo "提取特定列:"
cut -c1-3,8-20 fixed_width.txt
echo ""
echo "1.6 处理CSV文件:"
cat > data.csv << 'EOF'
ID,Name,Age,City,Salary
101,Alice,25,New York,75000
102,Bob,30,London,92000
103,Carol,28,Paris,68000
104,David,35,Tokyo,88000
EOF
echo "提取姓名和城市:"
cut -d, -f2,4 data.csv
echo ""
echo "1.7 与sort配合使用:"
echo "按姓名排序:"
cut -d, -f2 data.csv | sort
echo ""
echo "1.8 处理包含空格的字段:"
cat > spaces.txt << 'EOF'
John Doe;25;New York
Jane Smith;30;London
Bob Johnson;35;Tokyo
EOF
echo "使用不同分隔符:"
cut -d';' -f1,3 spaces.txt
echo ""
echo "1.9 实战示例 - 提取日志信息:"
cat > web_log.txt << 'EOF'
192.168.1.1 - - [15/Dec/2023:10:30:45 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [15/Dec/2023:10:31:15 +0800] "POST /api/login HTTP/1.1" 401 567
192.168.1.3 - - [15/Dec/2023:10:32:30 +0800] "GET /products HTTP/1.1" 200 8901
EOF
echo "提取IP地址:"
cut -d' ' -f1 web_log.txt
echo ""
echo "提取HTTP方法:"
cut -d'"' -f2 web_log.txt | cut -d' ' -f1
echo ""
echo "1.10 处理多字节字符:"
cat > utf8_data.txt << 'EOF'
1:张三:工程师:25
2:李四:设计师:28
3:王五:经理:32
EOF
echo "处理UTF-8数据:"
cut -d: -f2 utf8_data.txt
echo ""
echo "2. paste工具"
echo "======================================"
cat > names.txt << 'EOF'
Alice
Bob
Carol
David
Eva
EOF
cat > ages.txt << 'EOF'
25
30
28
35
27
EOF
cat > cities.txt << 'EOF'
New York
London
Paris
Tokyo
Berlin
EOF
echo "2.1 基本合并:"
paste names.txt ages.txt
echo ""
echo "2.2 自定义分隔符:"
paste -d', ' names.txt ages.txt cities.txt
echo ""
echo "2.3 垂直合并:"
paste -s names.txt ages.txt cities.txt
echo ""
echo "2.4 创建表格:"
paste -d' | ' - - - < names.txt
echo ""
echo "2.5 序列合并:"
echo -e "1\n2\n3\n4\n5" | paste -sd,
echo ""
echo "2.6 实际应用 - 创建CSV:"
paste -d',' names.txt ages.txt cities.txt > combined.csv
echo "生成的CSV文件:"
cat combined.csv
echo ""
echo "2.7 与cut配合使用:"
echo "重新排列列:"
cut -d, -f1,3 combined.csv | paste -d',' - <(cut -d, -f2 combined.csv)
echo ""
echo "3. join工具"
echo "======================================"
echo "3.1 基本连接:"
echo "员工数据:"
cat employees.txt
echo ""
echo "部门数据:"
cat departments.txt
echo ""
echo "按部门连接:"
join -t: -1 3 -2 1 <(sort -t: -k3 employees.txt) <(sort -t: -k1 departments.txt)
echo ""
echo "3.2 内连接:"
cat > dept_sorted.txt << 'EOF'
Design:Creative Suite:15
Engineering:Tech Building:50
Marketing:West Wing:25
Sales:Main Building:30
EOF
cat > emp_sorted.txt << 'EOF'
101:Alice Johnson:Engineering:75000
102:Bob Smith:Sales:92000
103:Carol Williams:Engineering:68000
104:David Brown:Marketing:55000
105:Eva Davis:Design:62000
EOF
echo "内连接结果:"
join -t: -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.3 左外连接:"
join -t: -a1 -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.4 右外连接:"
join -t: -a2 -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.5 全外连接:"
join -t: -a1 -a2 -1 3 -2 1 emp_sorted.txt dept_sorted.txt
echo ""
echo "3.6 指定输出格式:"
join -t: -1 3 -2 1 -o 1.1,1.2,1.3,2.2,1.4
emp_sorted.txt dept_sorted.txt |
awk -F: '{printf "%-3s %-15s %-12s %-15s %s\n", $1,$2,$3,$4,$5}'
echo ""
echo "3.7 处理大文件连接:"
创建测试数据
echo "生成测试数据..."
for i in {1..1000}; do
echo "user$i:dept$((RANDOM%10)):salary$((RANDOM*100))"
done > large_emp.txt
for i in {0..9}; do
echo "dept$i:location$i:size$((RANDOM*10))"
done > large_dept.txt
排序文件
sort -t: -k2 large_emp.txt > large_emp_sorted.txt
sort -t: -k1 large_dept.txt > large_dept_sorted.txt
echo "大文件连接测试:"
time join -t: -1 2 -2 1 large_emp_sorted.txt large_dept_sorted.txt > /dev/null
echo "连接完成"
echo ""
echo "4. 综合实战案例"
echo "======================================"
echo "4.1 员工信息报表生成:"
echo "生成员工详细信息报表..."
cat > report_script.sh << 'EOF'
#!/bin/bash
员工信息报表生成脚本
创建临时数据文件
cat > employees_full.txt << 'END'
101:Alice Johnson:Engineering:75000:alice@company.com:555-0101
102:Bob Smith:Sales:92000:bob@company.com:555-0102
103:Carol Williams:Engineering:68000:carol@company.com:555-0103
104:David Brown:Marketing:55000:david@company.com:555-0104
105:Eva Davis:Design:62000:eva@company.com:555-0105
106:Frank Miller:HR:48000:frank@company.com:555-0106
END
cat > departments_full.txt << 'END'
Engineering:Tech Building:3rd Floor:50:John Doe
Sales:Main Building:1st Floor:30:Jane Smith
Marketing:West Wing:2nd Floor:25:Bob Johnson
Design:Creative Suite:4th Floor:15:Alice Brown
HR:East Wing:2nd Floor:20:Carol Wilson
END
cat > salaries.txt << 'END'
101:75000:5000:80000
102:92000:7000:99000
103:68000:4500:72500
104:55000:3500:58500
105:62000:4000:66000
106:48000:3000:51000
END
echo "=== 员工综合信息报表 ==="
echo "生成时间: $(date)"
echo "================================================"
生成主报表
echo "员工基本信息:"
echo "ID 姓名 部门 薪资 邮箱"
echo "------------------------------------------------"
cut -d: -f1-4,5 employees_full.txt |
awk -F: '{printf "%-4s %-15s %-12s $%-7s %s\n", $1,$2,$3,$4,$5}' |
sort -k2
echo ""
部门统计
echo "部门统计信息:"$%-10.2f $ %-9d $%-9d\n",
echo "部门 人数 平均薪资 最大薪资 最小薪资"
echo "--------------------------------------------------------"
join -t: -1 3 -2 1
<(sort -t: -k3 employees_full.txt)
<(sort -t: -k1 departments_full.txt) |
cut -d: -f1,4 |
awk -F: '{
dept[$1]++
total[$1] += $2
if($2 > max[$1] || max[$1] == "") max[$1] = $2
if($2 < min[$1] || min[$1] == "") min[$1] = $2
}
END {
for(d in dept) {
avg = total[d] / dept[d]
printf "%-12s %-6d
d, dept[d], avg, max[d], min[d]
}
}' | sort
echo ""
薪资分析
echo "薪资分析:"$%-10s $ %-7s $%-8s\n",
echo "ID 姓名 基本薪资 奖金 总薪资"
echo "--------------------------------------------------"
join -t: -1 1 -2 1
<(cut -d: -f1,2 employees_full.txt | sort -t: -k1)
<(sort -t: -k1 salaries.txt) |
awk -F: '{
total = $3 + $4
printf "%-4s %-15s
$1, $2, $3, $4, total
basic_total += $3
bonus_total += $4
grand_total += total
count++
}
END {
print "--------------------------------------------------"
printf "总计: %d 名员工\n", count
printf "基本薪资总额: $%d\n", basic_total
printf "奖金总额: $%d\n", bonus_total
printf "薪资总额: $%d\n", grand_total
printf "平均总薪资: $%.2f\n", grand_total/count
}'
echo ""
清理临时文件
rm -f employees_full.txt departments_full.txt salaries.txt
EOF
chmod +x report_script.sh
./report_script.sh
echo ""
echo "4.2 日志分析系统:"
cat > log_analyzer.sh << 'EOF'
#!/bin/bash
日志分析系统
创建示例日志文件
cat > access_log.txt << 'END'
192.168.1.1 - alice [15/Dec/2023:10:30:45 +0800] "GET /index.html HTTP/1.1" 200 1234 "Mozilla/5.0"
192.168.1.2 - bob [15/Dec/2023:10:31:15 +0800] "POST /api/login HTTP/1.1" 401 567 "Chrome/91.0"
192.168.1.1 - alice [15/Dec/2023:10:32:30 +0800] "GET /products HTTP/1.1" 200 8901 "Firefox/89.0"
192.168.1.3 - carol [15/Dec/2023:10:33:45 +0800] "GET /about.html HTTP/1.1" 200 2345 "Safari/14.0"
192.168.1.2 - bob [15/Dec/2023:10:34:00 +0800] "GET /contact HTTP/1.1" 404 123 "Chrome/91.0"
192.168.1.4 - david [15/Dec/2023:10:35:15 +0800] "POST /api/data HTTP/1.1" 500 789 "Edge/92.0"
END
echo "=== Web访问日志分析报告 ==="
echo "分析时间: $(date)"
echo "日志文件: access_log.txt"
echo "总行数: $(wc -l < access_log.txt)"
echo "========================================"
1. IP地址统计
echo "1. IP访问统计:"
echo "IP地址 访问次数 总流量(B)"
echo "----------------------------------"
cut -d' ' -f1 access_log.txt | sort | uniq -c |
awk '{print $2, $1}' |
while read ip count; do
bytes=$(grep "^$ip " access_log.txt |
awk '{sum+=$10} END{print sum}')
printf "%-15s %-9d %-10d\n" $ip $count $bytes
done | sort -rnk2
echo ""
2. 状态码统计
echo "2. HTTP状态码统计:"
echo "状态码 次数 百分比"
echo "-----------------------"
awk '{print $9}' access_log.txt | sort | uniq -c |
awk -v total="$(wc -l < access_log.txt)" '{
percent = ($1/total)*100
printf "%-7s %-5d %-6.1f%%\n", $2, $1, percent
}'
echo ""
3. URL访问统计
echo "3. 最常访问的URL:"
echo "URL 访问次数"
echo "--------------------------------"
awk -F'"' '{print $2}' access_log.txt |
awk '{print $2}' |
sort | uniq -c |
sort -rn | head -5 |
awk '{printf "%-20s %-8d\n", $2, $1}'
echo ""
4. 用户代理统计
echo "4. 浏览器/客户端统计:"
echo "客户端 次数"
echo "--------------------------------"
awk -F'"' '{print $6}' access_log.txt |
sort | uniq -c |
sort -rn |
awk '{printf "%-20s %-6d\n", $2, $1}'
echo ""
5. 时间分析
echo "5. 按小时访问统计:"
echo "小时 访问次数"
echo "--------------"
awk '{print $4}' access_log.txt |
cut -d: -f2 |
sort | uniq -c |
awk '{printf "%-6s %-8d\n", $2, $1}'
echo ""
清理
rm -f access_log.txt
EOF
chmod +x log_analyzer.sh
./log_analyzer.sh
echo ""
echo "4.3 数据转换和清理:"
cat > data_cleaner.sh << 'EOF'
#!/bin/bash
数据清理和转换工具
创建脏数据
cat > dirty_data.csv << 'END'
ID,Name,Age,City,Salary,Department
101,"John Doe",25,New York,75000,Engineering
102,"Jane Smith",,London,92000,Sales
103,"Bob Johnson",35,Tokyo,68000,
104,"Alice Brown",28,"Paris, France",62000,Design
105,"Charlie, Lee",30,Beijing,,Marketing
106,"David Wang",42,"San Francisco, CA",88000,Engineering
END
echo "原始数据:"
cat dirty_data.csv
echo ""
echo "========================================"
echo "数据清理过程:"
echo ""
1. 修复缺失值
echo "1. 处理缺失值:"
echo "发现缺失值 -> 填充默认值"
awk -F, '
BEGIN {OFS=","}
{
# 检查并修复年龄
if ($3 == "" || $3 == " ") $3 = "30"
}' dirty_data.csv > cleaned_step1.csv
echo "第一步清理完成"
echo ""
2. 处理包含逗号的字段
echo "2. 处理包含特殊字符的字段:"
echo "修复包含逗号的姓名和城市字段"
cat cleaned_step1.csv |
awk '
BEGIN {FPAT = "([^,]*)|("[^\"]+")"; OFS=","}
{
# 清理引号
for(i=1; i<=NF; i++) {
gsub(/^"|"$/, "", $i)
}
print $0
}' > cleaned_step2.csv
echo "第二步清理完成"
echo ""
3. 格式化输出
echo "3. 格式化最终数据:"
echo "ID 姓名 年龄 城市 薪资 部门"
echo "------------------------------------------------------------"
awk -F, 'NR>1 {
printf "%-4s %-15s %-4s %-18s $%-7s %s\n",
$1, $2, $3, $4, $5, $6
}' cleaned_step2.csv
echo ""
4. 生成报告
echo "4. 数据质量报告:"
echo "总记录数: $(tail -n +2 cleaned_step2.csv | wc -l)"
echo "有效年龄记录: $(awk -F, 'NR>1 && $3 != "" && $3 != " " {count++} END{print count}' cleaned_step2.csv)"
echo "有效薪资记录: $(awk -F, 'NR>1 && $5 != "" && $5 != " " {count++} END{print count}' cleaned_step2.csv)"
echo "有效部门记录: $(awk -F, 'NR>1 && $6 != "" && $6 != " " {count++} END{print count}' cleaned_step2.csv)"
echo ""
清理临时文件
rm -f dirty_data.csv cleaned_step1.csv cleaned_step2.csv
EOF
chmod +x data_cleaner.sh
./data_cleaner.sh
echo ""
echo "5. 性能优化技巧"
echo "======================================"
创建大文件测试性能
echo "创建性能测试数据..."
time (
for i in {1..100000}; do
echo "user$((RANDOM%1000)):dept$((RANDOM%10)):salary$((RANDOM*100)):city$((RANDOM%20))"
done > perf_test.txt
)
echo "5.1 cut性能测试:"
echo "使用cut提取字段:"
time cut -d: -f2 perf_test.txt > /dev/null
echo ""
echo "使用awk提取字段:"
time awk -F: '{print $2}' perf_test.txt > /dev/null
echo ""
echo "5.2 sort性能优化:"
echo "默认排序:"
time sort perf_test.txt > /dev/null
echo ""
echo "指定缓冲区大小:"
time sort -S 100M perf_test.txt > /dev/null
echo ""
echo "使用临时目录:"
time sort -T /tmp perf_test.txt > /dev/null
echo ""
echo "5.3 join性能优化:"
准备排序文件
sort -t: -k2 perf_test.txt > perf_test_sorted.txt
cat > dept_lookup.txt << 'END'
dept0:Department 0:Building A
dept1:Department 1:Building B
dept2:Department 2:Building C
dept3:Department 3:Building D
dept4:Department 4:Building E
dept5:Department 5:Building F
dept6:Department 6:Building G
dept7:Department 7:Building H
dept8:Department 8:Building I
dept9:Department 9:Building J
END
sort -t: -k1 dept_lookup.txt > dept_lookup_sorted.txt
echo "连接大文件:"
time join -t: -1 2 -2 1 perf_test_sorted.txt dept_lookup_sorted.txt > /dev/null
echo ""
echo "5.4 内存使用优化:"
echo "处理大文件时使用管道:"
time cut -d: -f1,2 perf_test.txt | sort | uniq -c > /dev/null
echo ""
清理测试文件
rm -f perf_test.txt perf_test_sorted.txt dept_lookup.txt dept_lookup_sorted.txt
echo "6. 错误处理"
echo "======================================"
echo "6.1 处理不存在的字段:"
echo "尝试提取不存在的字段:"
echo "test:line" | cut -d: -f5 2>&1 || true
echo ""
echo "6.2 处理空文件:"
touch empty.txt
echo "处理空文件:"
cut -d: -f1 empty.txt 2>&1 || echo "空文件,无输出"
echo ""
echo "6.3 处理格式错误:"
echo "处理格式不一致的数据:"
echo -e "field1:field2\nfield1,field2\nfield1 field2" | cut -d: -f2 2>&1
echo ""
echo "6.4 处理权限问题:"
echo "尝试读取无权限文件:"
touch no_read.txt
chmod 000 no_read.txt
cut -d: -f1 no_read.txt 2>&1 | head -1
chmod 644 no_read.txt
rm -f no_read.txt
echo ""
echo "7. 实用脚本示例"
echo "======================================"
echo "7.1 批量重命名工具:"
cat > batch_rename.sh << 'EOF'
#!/bin/bash
批量重命名工具
创建测试文件
mkdir -p test_files
cd test_files
for i in {1..5}; do
echo "Content of file $i" > "old_name_$i.txt"
done
echo "重命名前:"
ls -1 *.txt
echo ""
批量重命名
counter=1
for file in *.txt; do
new_name="document_$(printf "%03d" $counter).txt"
echo "重命名: $file -> $new_name"
mv "$file" "$new_name"
((counter++))
done
echo ""
echo "重命名后:"
ls -1 *.txt
清理
cd ..
rm -rf test_files
EOF
chmod +x batch_rename.sh
echo "执行批量重命名示例:"
./batch_rename.sh
echo ""
echo "7.2 系统监控脚本:"
cat > system_monitor.sh << 'EOF'
#!/bin/bash
系统监控脚本
echo "=== 系统监控报告 ==="
echo "生成时间: $(date)"
echo "主机名: $(hostname)"
echo "运行时间: $(uptime -p)"
echo "========================================"
CPU使用率
echo "1. CPU使用率:"
top -bn1 | grep "Cpu(s)" |
awk '{printf "用户: %.1f%% 系统: %.1f%% 空闲: %.1f%%\n", $2, $4, $8}'
echo ""
内存使用
echo "2. 内存使用:"
free -h | awk '
NR==2 {printf "总量: %s 已用: %s 空闲: %s 使用率: %.1f%%\n",
$2, $3, $4, ($3/$2)*100}'
echo ""
磁盘使用
echo "3. 磁盘使用率:"
df -h | awk '
NR>1 && $5+0 > 80 {
printf "警告: %s 使用率 %s (可用: %s)\n", $1, $5, $4
}'
echo ""
进程监控
echo "4. 内存使用最高的5个进程:"
ps aux --sort=-%mem | awk '
NR<=6 {
if(NR==1) print "USER PID %CPU %MEM COMMAND"
else printf "%-8s %6s %6.1f %6.1f %s\n", $1, $2, $3, $4, $11
}'
echo ""
网络连接
echo "5. 网络连接统计:"
ss -tun | awk '
/^tcp/ {state[$2]++}
END {
print "TCP连接状态:"
for(s in state) {
printf " %-12s: %d\n", s, state[s]
}
}'
echo ""
登录用户
echo "6. 当前登录用户:"
who | awk '{print $1}' | sort | uniq -c |
awk '{printf "用户 %s: %d 个会话\n", $2, $1}'
EOF
chmod +x system_monitor.sh
echo "执行系统监控:"
./system_monitor.sh
echo ""
清理脚本文件
rm -f report_script.sh log_analyzer.sh data_cleaner.sh
batch_rename.sh system_monitor.sh employees.txt
departments.txt projects.txt fixed_width.txt
data.csv spaces.txt web_log.txt utf8_data.txt
names.txt ages.txt cities.txt combined.csv
emp_sorted.txt dept_sorted.txt empty.txt
echo "=== cut、paste、join工具深度掌握完成 ==="
英语学习部分
bash
#!/bin/bash
english_terms.sh
echo "=== 文本处理工具专业英语词汇 ==="
echo ""
echo "1. 核心工具术语:"
echo "========================================"
cat << 'EOF'
cut - Extract sections from lines of files
- 从文件行中提取部分内容
paste - Merge lines of files
- 合并文件行
join - Join lines of two files on a common field
- 基于公共字段连接两个文件的行
sort - Sort lines of text files
- 对文本文件的行进行排序
awk - Pattern scanning and processing language
- 模式扫描和处理语言
sed - Stream editor for filtering and transforming text
- 用于过滤和转换文本的流编辑器
grep - Print lines that match patterns
- 打印匹配模式的行
EOF
echo ""
echo "2. 常用参数术语:"
echo "========================================"
cat << 'EOF'
-d, --delimiter - Specify field delimiter
- 指定字段分隔符
-f, --fields - Select only these fields
- 仅选择这些字段
-s, --serial - Paste one file at a time
- 每次粘贴一个文件
-u, --unique - Output only unique lines
- 仅输出唯一行
-n, --numeric - Compare according to string numerical value
- 根据字符串数值比较
-r, --reverse - Reverse the result of comparisons
- 反转比较结果
-t, --field-separator - Specify input field separator
- 指定输入字段分隔符
-o, --output - Specify output format
- 指定输出格式
EOF
echo ""
echo "3. 数据处理概念:"
echo "========================================"
cat << 'EOF'
Field - A unit of data in a record
- 记录中的数据单元
Delimiter - A character that separates fields
- 分隔字段的字符
Record - A complete set of related data fields
- 一组完整的相关数据字段
CSV (Comma-Separated Values) - Data format using commas as delimiters
- 使用逗号作为分隔符的数据格式
TSV (Tab-Separated Values) - Data format using tabs as delimiters
- 使用制表符作为分隔符的数据格式
Parsing - Analyzing text to extract structured information
- 分析文本以提取结构化信息
Filtering - Selecting specific data based on criteria
- 根据条件选择特定数据
Transformation - Changing data from one format to another
- 将数据从一种格式转换为另一种格式
Concatenation - Combining strings or data end-to-end
- 将字符串或数据首尾相连
Joining - Combining data from different sources based on keys
- 基于键合并来自不同源的数据
EOF
echo ""
echo "4. 实用表达句式:"
echo "========================================"
cat << 'EOF'
To extract specific columns from a file:
Example: Use cut -d',' -f1,3 data.csv
To merge multiple files side by side:
Example: paste file1.txt file2.txt
To join two files based on a common field:
Example: join -t':' file1.txt file2.txt
To sort data numerically in reverse order:
Example: sort -nr data.txt
To filter lines containing a pattern:
Example: grep "error" logfile.txt
To perform complex text transformations:
Example: awk '{print $1, $3}' data.txt
To remove duplicate entries:
Example: sort file.txt | uniq
To count occurrences of each line:
Example: sort file.txt | uniq -c
EOF
echo ""
echo "5. 常见错误处理:"
echo "========================================"
cat << 'EOF'
"No such file or directory"
"Invalid argument" or "Illegal option"
"Syntax error" in awk/sed
"Memory exhausted" when processing large files
"Permission denied"
"Field number is out of range"
"Join failed" due to unsorted files
"Disk space exhausted"
EOF
echo ""
echo "6. 面试常见问题:"
echo "========================================"
cat << 'EOF'
Q: What is the difference between cut and awk?
A: cut is simpler and faster for extracting fixed columns,
while awk is more powerful for complex text processing.
Q: How would you merge multiple CSV files?
A: I would use paste for side-by-side merging or cat for
end-to-end merging, depending on the requirement.
Q: When would you use join vs awk for merging files?
A: join is more efficient for simple field-based joins,
while awk provides more flexibility for complex logic.
Q: How do you handle large files that don't fit in memory?
A: Use streaming tools like sed, awk, or split the file
and process in chunks.
Q: What's the difference between sort | uniq and sort -u?
A: sort -u is generally faster as it's a single command,
but sort | uniq is more readable in pipelines.
Q: How would you extract data from JSON or XML files?
A: For simple cases, use tools like jq for JSON or
xmlstarlet for XML. For complex cases, consider Python.
Q: What are some performance optimization techniques?
A: Use appropriate buffer sizes, avoid unnecessary
intermediate files, and use built-in functions.
Q: How do you debug text processing pipelines?
A: Use tee to check intermediate output, add echo
statements, and test each command separately.
EOF
echo ""
echo "7. 实用文档阅读:"
echo "========================================"
echo "阅读并理解以下man page摘要:"
echo ""
cat << 'EOF'
CUT(1) - extract columns from files
SYNOPSIS
cut OPTION... [FILE]...
DESCRIPTION
Print selected parts of lines from each FILE to standard output.
EOF
echo ""
echo "8. 实践练习:"
echo "========================================"
cat << 'EOF'
练习1:解析Apache访问日志
目标:提取IP地址、状态码和访问量
命令:awk '{print $1, $9}' access.log | sort | uniq -c | sort -rn
练习2:合并两个数据集
目标:基于员工ID合并工资和部门信息
命令:join -t',' -1 1 -2 1 salaries.csv departments.csv
练习3:数据清洗
目标:清理包含空值和格式问题的CSV文件
命令:awk -F, 'BEGIN {OFS=","} {if($3=="") $3="N/A"; print}' data.csv
练习4:生成报表
目标:创建格式化的系统资源报表
命令:df -h | awk '{printf "%-20s %-10s %-10s %-10s\n", $1,$2,$3,$5}'
练习5:监控脚本
目标:编写监控磁盘使用率的脚本
命令:df -h | awk '$5+0 > 80 {print "警告: " $1 " 使用率 " $5}'
EOF
echo ""
echo "=== 英语学习部分完成 ==="
每日实践任务
bash
#!/bin/bash
daily_practice.sh
echo "=== Day 19 每日实践任务 ==="
echo ""
echo "任务1:文本处理基础"
echo "========================================"
cat << 'EOF'
创建一个包含以下内容的文件 employees.csv:
ID,Name,Age,Department,Salary
101,John Smith,30,Engineering,75000
102,Jane Doe,28,Marketing,65000
103,Bob Johnson,35,Sales,82000
104,Alice Brown,32,Engineering,78000
使用cut提取姓名和部门:
cut -d',' -f2,4 employees.csv
使用awk计算平均年龄和平均工资:
awk -F, 'NR>1 {age+=$3; salary+=$5; count++}
END {print "平均年龄:", age/count, "平均工资:", salary/count}' employees.csv
使用sort按工资降序排序:
sort -t',' -k5nr employees.csv
EOF
echo ""
echo "任务2:数据合并"
echo "========================================"
cat << 'EOF'
创建部门信息文件 departments.csv:
Department,Location,Manager
Engineering,Building A,David Chen
Marketing,Building B,Sarah Wang
Sales,Building C,Michael Liu
使用join合并员工和部门信息:
join -t',' -1 4 -2 1 <(sort -t',' -k4 employees.csv) <(sort -t',' -k1 departments.csv)
使用paste创建员工信息卡:$0; next} {print " 工资: $ " $0}'
paste -d'\n' <(cut -d',' -f2 employees.csv)
<(cut -d',' -f5 employees.csv) |
awk 'NR%2{printf "姓名: %-15s",
EOF
echo ""
echo "任务3:日志分析实战"
echo "========================================"
cat << 'EOF'
分析nginx访问日志(模拟数据):
cat > access.log << 'END'
192.168.1.1 - - [15/Dec/2023:10:30:45 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [15/Dec/2023:10:31:15 +0800] "POST /api/login HTTP/1.1" 401 567
192.168.1.1 - - [15/Dec/2023:10:32:30 +0800] "GET /products HTTP/1.1" 200 8901
END
统计IP访问次数:
awk '{print $1}' access.log | sort | uniq -c | sort -rn
统计HTTP状态码:
awk '{print $9}' access.log | sort | uniq -c
提取访问量最高的URL:
awk -F'"' '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -rn
EOF
echo ""
echo "任务4:系统监控脚本"
echo "========================================"
cat << 'EOF'
编写一个系统监控脚本,包含以下功能:
示例脚本框架:
#!/bin/bash
echo "=== 系统监控报告 ==="
echo "时间: $(date)"
echo "---"
echo "磁盘使用:"
df -h | awk '$5+0 > 80'
echo "---"
echo "内存使用:"
free -h
echo "---"
echo "进程监控:"
ps aux --sort=-%cpu | head -6
EOF
echo ""
echo "任务5:英语练习"
echo "========================================"
cat << 'EOF'
阅读并翻译以下awk命令:
awk 'BEGIN {FS=":"; OFS="\t"} {print $1, $3, $5}' /etc/passwd
用英语解释sort命令的以下参数:
-n, -r, -k, -t
描述如何使用join命令合并两个CSV文件
解释以下管道命令的作用:
cat logfile | grep "ERROR" | cut -d' ' -f1-3 | sort | uniq -c
用英语写一个简单的文本处理脚本注释
EOF
echo ""
echo "任务6:性能优化"
echo "========================================"
cat << 'EOF'
处理一个大型日志文件(假设有100万行):
使用split分割文件:
split -l 100000 large.log chunk_
并行处理每个分块:
for file in chunk_*; do
process_chunk "$file" &
done
wait
合并结果:
cat result_* > final_result.txt
清理临时文件:
rm -f chunk_* result_*
优化技巧:
EOF
echo ""
echo "任务7:错误处理实践"
echo "========================================"
cat << 'EOF'
编写一个健壮的文本处理脚本,包含:
示例:
#!/bin/bash
LOG_FILE="process.log"
process_file() {
local file="$1"
}
EOF
echo ""
echo "=== 今日实践任务完成 ==="
echo "建议:每个任务完成后,用英语写下遇到的问题和解决方案"
这个完整的Day 19学习计划包含了:
技术深度:awk、sort、cut、paste、join工具的全面掌握
英语学习:专业术语、实用表达、面试问题、文档阅读
实践任务:从基础到高级的实战练习
性能优化:处理大文件的技巧和方法
错误处理:健壮脚本的编写技巧
按照这个计划,学习者可以系统地掌握Linux文本处理的核心工具,同时提升相关的专业英语能力。
请继续
Linux运维与专业英语完整学习体系(第三部分:脚本编程与自动化篇)
Day 20:Shell脚本编程高级技巧
技术学习部分
bash
#!/bin/bash
shell_debugging.sh
====================
Shell脚本调试与优化
====================
echo "=== Shell脚本调试与优化 ==="
echo "1. 调试技术"
echo "======================================"
1.1 基本调试选项
cat > debug_demo.sh << 'EOF'
#!/bin/bash
调试演示脚本
启用调试选项
set -x # 显示执行的命令
set -e # 出错即退出
set -u # 使用未定义变量时报错
set -o pipefail # 管道命令失败时整个命令失败
echo "=== 调试演示开始 ==="
定义变量
filename="test.txt"
count=5
创建测试文件
for i in $(seq 1 $count); do$i: Sample data $ (date)" >> $filename
echo "Line
done
处理文件
wc -l $filename
echo "文件行数统计完成"
故意制造错误
non_existent_cmd
echo "这行不会执行"
清理
rm -f $filename
echo "=== 调试演示结束 ==="
EOF
chmod +x debug_demo.sh
Linux运维与专业英语完整学习体系(第三部分:脚本编程与自动化篇)
Day 24:容器编排与Kubernetes基础
技术学习部分
请从day1开始,每天讲解需要详细,做为一个新人,需要完整的,详细的介绍给新人。
另外还需要补充实际生成环境的操作方式、生产环境的行为和数据案例等。