diff --git "a/50 \347\216\213\346\231\264/20240603awk\345\221\275\344\273\244\347\224\250\346\263\225.md" "b/50 \347\216\213\346\231\264/20240603awk\345\221\275\344\273\244\347\224\250\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..e4cc07494f8b04e5949e3e5629cdd55b09d39c29 --- /dev/null +++ "b/50 \347\216\213\346\231\264/20240603awk\345\221\275\344\273\244\347\224\250\346\263\225.md" @@ -0,0 +1,106 @@ +## awk + +awk、grep、sed是linux操作文本的三大利器,合称文本三剑客 + +格式 + +```bash +awk [选项] '脚本' 文件 +awk 'pattern { actions }' # 即 模式 {动作} +``` + +- 如果没有指定模式,则对每一行都执行动作。 +- 指定模式后,只有匹配模式的行,才执行动作,即满足条件才执行 + +选项: + +- `-F`:指定输入字段分隔符。例如,`-F,` 将逗号设置为字段分隔符。 + - 默认是以空格\t等为分隔符 + - 类似于FS="分隔符" 在文件中使用 + - OFS 输出分隔符 + +- `-v`:赋值外部变量。例如,`-v var=value`。 min=60 +- `-f`:指定 Awk 脚本文件。例如,`-f script.awk`。 +- `-W`:控制警告和其他运行时选项。例如,`-W version` 用于显示版本信息。 + +脚本: + +1. 开始语句块:在程序开始时执行 `BEGIN { print "start" }` +2. 通用语句块:逐行处理文件内容 `pattern { commands }`, +3. 结束语句块:在程序结束时执行 `END { print "end" }` + +匹配正则表达式 + +- `/pattern/`:匹配包含指定模式的行。例如,`/error/` 匹配所有包含“error”的行。 +- $2 ~ /pattern/ :匹配第2列包含关键字pattern的行, +- $2 !~ /pattern/:匹配第2列不包含关键字pattern的行 + +- 比较运算符 + - 匹配第 n 行。例如,`NR == 1` 匹配第一行。 + - `==`(等于),例$2 == "张三" 匹配第二列等于张三的行 + - `!=`(不等于) + - `<`(小于) + - `<=`(小于等于) + - `>`(大于) + - `>=`(大于等于) + +- 逻辑运算符 + - `NR >= m && NR <= n`:匹配第 m 到第 n 行。例如,`NR >= 2 && NR <= 4` 匹配第2到第4行。 + - `&&`:逻辑与(AND) + - `||`:逻辑或(OR) + - `!`:逻辑非(NOT) + +- 三元运算符 + - 条件运算符 `? :` + - grade = ($2 >= 60 ? "及格" : "不及格") + +### 作业: + +1. 只显示/etc/passwd的账户 + +```bash +awk -F: '{print $1}' /etc/passwd +``` + +2.只显示/etc/passwd的账户和对应的shell,并在第一行上添加列名用户制表符shell,最后一行添加---------------- + +```bash +awk -F: 'BEGIN {print "用户名\tshell"} {print $1,$7} END{print "-------"}' /etc/passwd +``` + +3.搜索/etc/passwd有关键字root的所有行 + +```bash +awk -F '/root/ {print}' /etc/passwd +``` + +4.统计/etc/passwd文件中,每行的行号,每列的列数,对应的完整行内容以制表符分隔 + +```bash +awk -F '{print NR,NF,$0}' /etc/passwd +``` + +5.输出/etc/passwd文件中以nologin结尾的行 + +```bash +awk -F: '$NF~/nologin/ {print $1,$NF}' /etc/passwd +``` + +6.输出/etc/passwd文件中uid字段小于100的行 + +```bash +awk -F: '$3<100 {print $0}' /etc/passwd +``` + +7./etc/passwd文件中gid字段大于200的,输出该行第一、第四字段,第一,第四字段并以制表符分隔 + +```bash +awk -F: '$4>200 {OFS="\t";print $1,$4}' /etc/passwd +``` + +8.输出/etc/passwd文件中uid字段大于等于100的行 + +```bash +awk -F: '$3>=100 {print $0}' /etc/passwd +``` +