diff --git "a/\347\216\213\346\226\260\351\233\205/20240603-awk\345\221\275\344\273\244.md" "b/\347\216\213\346\226\260\351\233\205/20240603-awk\345\221\275\344\273\244.md" new file mode 100644 index 0000000000000000000000000000000000000000..625dae054fc1255bd7221d493bacf1d3d4b7451b --- /dev/null +++ "b/\347\216\213\346\226\260\351\233\205/20240603-awk\345\221\275\344\273\244.md" @@ -0,0 +1,119 @@ +#### awk + +是一个强大的文本处理工具,适用于在 Linux 和类 Unix 系统上处理结构化文本数据。它特别适合处理按列组织的文本文件 + +4 +5 ### 基本语法 +6 +7 ```JS +8 awk 'pattern { action }' file +9 ``` +10 +11 - pattern:可选,指定文本行的匹配模式。 +12 - action:对匹配的文本行执行的操作。 +13 - file:要处理的文件。 +14 +15 ## 选项 +16 +17 - F:指定输入字段分隔符。 +18 - v:定义变量。 +19 - f:从脚本文件读取 awk 程序 +20 +21 ### 内置变量 +22 +23 - sNF:当前记录的字段数。 +24 - sNR:当前记录的行号。 +25 - sFS:输入字段分隔符。 +26 - sOFS:输出字段分隔符。 +27 - sRS:输入记录分隔符。 +28 - sORS:输出记录分隔符。 +29 - s$0:当前记录(整行)。 +30 - s$n:当前记录的第 n 个字段。 +31 +32 ### 打印文件内容 +33 +34 ```js +35 awk '{ print }' example.txt +36 ``` +37 +38 ### 打印特定字段 +39 +40 ##### 假设 example.txt 内容如下 +41 +42 ```sh +43 Alice 30 +44 Bob 25 +45 Charlie 35 +46 +47 ``` +48 +49 打印第一列(名字): +50 +51 ```js +52 awk '{ print $1 }' example.txt +53 ``` +54 +55 ### 条件匹配 +56 +57 ##### 打印年龄大于 30 的行 +58 +59 ```sh +60 awk '$2 > 30 { print }' example.txt +61 ``` +62 +63 ##### 打印名字为 "Bob" 的行 +64 +65 ```js +66 awk '$1 == "Bob" { print }' example.tx +67 ``` +68 +69 ### 使用字段分隔符 +70 +71 ```sh +72 awk -F, '{ print 1, +2 }' data.csv +73 ``` +74 +75 ##### 打印每行的字段数和内容 +76 +77 ```sh +78 awk '{ print NF, $0 }' example.txt +79 ``` +80 +81 ## 使用操作符 +82 +83 - +:加 +84 - -:减 +85 - *:乘 +86 - /:除 +87 - %:取模 +88 - ^:幂 +89 +90 ##### 计算每行第二列的平方 +91 +92 ```JS +93 awk '{ print $2^2 }' example.txt +94 ``` +95 +96 ## 开始语句包和结束语句包 +97 +98 ### 开始语句(BEGIN) +99 +100 ##### BEGIN 语句块在 awk 开始处理输入文件之前执行。它通常用于初始化变量、设置字段分隔符和其他预处理任务 +101 +102 ```js +103 awk 'BEGIN { actions }' file +104 ``` +105 +106 ### 结束语句块(END) +107 +108 ##### END 语句块在 awk 完成对所有输入文件的处理后执行。它通常用于打印总结信息或执行清理工作 +109 +110 ```js +111 awk '{ actions } END { actions }' file +112 ``` +113 +114 #### 开始语句、中间、结束语句 +115 +116 ```js +117 awk 'BEGIN {print "姓名"} {sum += $3} {print} END {print "思政成绩", sum}' fenshu.txt \ No newline at end of file