diff --git "a/03\351\231\210\346\255\243\346\245\240/20240604awk\345\221\275\344\273\244\347\224\250\346\263\225.md" "b/03\351\231\210\346\255\243\346\245\240/20240604awk\345\221\275\344\273\244\347\224\250\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..8edaf4a52798ebaaa1f63b9770fb1d8053ca4a6d --- /dev/null +++ "b/03\351\231\210\346\255\243\346\245\240/20240604awk\345\221\275\344\273\244\347\224\250\346\263\225.md" @@ -0,0 +1,93 @@ +````bash +awk、grep、sed是linux操作文本三剑客 + +AWK 脚本由一个或多个语句块组成,每个语句块可以是以下三种之一: + +1. 开始语句块:在程序开始时执行 `BEGIN { print "start" }` +2. 通用语句块:逐行处理文件内容 `pattern { commands }`, +3. 结束语句块:在程序结束时执行 `END { print "end" } + +Awk 中的常用选项(限命令行) + +* `-F`:指定输入字段分隔符。例如,`-F,` 将逗号设置为字段分隔符。 + + * 默认是以空格\t等为分隔符 + * 类似于FS="分隔符" 在文件中使用 + +* `-v`:赋值外部变量。例如,`-v var=value`。 min=60 + +* `-f`:指定 Awk 脚本文件。例如,`-f script.awk`。 + +* `-W`:控制警告和其他运行时选项。例如,`-W version` 用于显示版本信息。 + +#### Awk 中的常用模式(pattern) + +语句块语法:由模式 (pattern) 和动作 (action) 构成。 + +``` +awk 'pattern { actions }' # 即 模式 {动作} +# 模式 (pattern): 可以是正则表达式、关系表达式、特定条件等。 +# 动作 (action): 一组语句,描述在匹配模式的行上执行的操作 +# 示例 +awk '/王/ { print $0 }' student_scores.csv +# 打印文件中所有包含 王 的行。 +awk -F, 'BEGIN { print "----开始-----" } +$2>=80 { print } +END { print "----结束-----" } +' student_scores.csv + +匹配正则表达式 + + - `/pattern/`:匹配包含指定模式的行。例如,`/error/` 匹配所有包含“error”的行。 + - $2 ~ /pattern/ :匹配第2列包含关键字pattern的行, + - $2 !~ /pattern/:匹配第2列不包含关键字pattern的行 + +- 比较运算符 + + - 匹配第 n 行。例如,`NR == 1` 匹配第一行。 + - `==`(等于),例$2 == "张三" 匹配第二列等于张三的行 + - `!=`(不等于) + - `<`(小于) + - `<=`(小于等于) + - `>`(大于) + - `>=`(大于等于) + + + 作业: + +1. 只显示/etc/passwd的账户 + + msy@hecs-155801:~$ awk -F: '{print $1}' /etc/passwd + + +2. 只显示/etc/passwd的账户和对应的shell,并在第一行上添加列名用户制表符shell,最后一行添加---------------- + + msy@hecs-155801:~$ awk -F: 'BEGIN {print "用户\tshell"} {print $1,$NF}' /etc/passwd + + +3. 搜索/etc/passwd有关键字root的所有行 + + awk -F: '/root/{print}' /etc/passwd + + +4. 统计/etc/passwd文件中,每行的行号,每列的列数,对应的完整行内容以制表符分隔 + + awk -F: '{print NR"\t"NF"\t"$0}' /etc/passwd + +5. 输出/etc/passwd文件中以nologin结尾的行 + + awk -F: '{OFS="\t";print NR,NF,$0}' /etc/passwd + + +6. 输出/etc/passwd文件中uid字段小于100的行 + + awk -F: '$3<100 {print}' /etc/passwd + +7. /etc/passwd文件中gid字段大于200的,输出该行第一、第四字段,第一,第四字段并以制表符分隔 + + awk -F: '$4>200 {print $1"\t"$4}' /etc/passwd + +8. 输出/etc/passwd文件中uid字段大于等于100的行 + + awk -F: '$3>100 {print}' /etc/passwd +```` diff --git "a/20240524\344\275\234\344\270\232.md" "b/20240524\344\275\234\344\270\232.md" deleted file mode 100644 index df629fd1d8df0b6d0151a7cced099c9aa2b8a2bc..0000000000000000000000000000000000000000 --- "a/20240524\344\275\234\344\270\232.md" +++ /dev/null @@ -1,90 +0,0 @@ -```` -假设您刚刚登录到一个Linux系统,并位于您的家目录(`~`)下。您需要完成以下一系列复杂的操作来组织和清理您的文件和目录。请按照顺序执行,并给出相应的命令。 - -1. **创建测试文件**:在家目录下创建三个文本文件,分别命名为`.hidden.txt`(隐藏文件)、`visible1.txt`和`visible2.txt`。 - - ``` - touch .hidden.txt visible1.txt visible2.txt - - ``` - -2. **列出文件和目录**:列出家目录(`~`)下的所有文件和目录,包括隐藏文件,并查看其详细权限和属性。 - - ``` - dddd@hecs-155801:~$ ls -a - . .. .bash_logout .bashrc .hidden.txt .profile visible1.txt visible2.txt - - ``` - -3. **创建工作区**:创建一个新的目录`work_area`,并在其中创建三个子目录:`project_a`、`project_b`和`docs`。 - - ``` - dddd@hecs-155801:~$ mkdir work_area - dddd@hecs-155801:~$ cd work_area/ - dddd@hecs-155801:~/work_area$ mkdir project_a project_b docs - - ``` - -4. **移动文本文件**:将家目录下的所有`.txt`文件移动到`work_area/docs`目录中,并确保这些文件在移动后仍然是隐藏的(如果它们是隐藏的)。 - - ``` - dddd@hecs-155801:~/work_area$ mv ../*.txt .*.txt docs/ - - - ``` - -``` -5. **创建新文件**:在`work_area/project_a`目录下创建一个新的文本文件`notes.txt`,并添加一些内容(例如:`echo "Initial notes for project A" > work_area/project_a/notes.txt`)。 - -``` - - dddd@hecs-155801:~/work_area/project_a$ touch notes.txt - dddd@hecs-155801:~/work_area/project_a$ vim notes.txt - -``` -6. **复制目录**:递归地复制`work_area/project_a`目录到`work_area/project_b`,并命名为`project_a_backup`。 - -``` - - dddd@hecs-155801:~/work_area$ cp -r project_a project_b - dddd@hecs-155801:~/work_area/project_b$ mv project_a project_a_backup - -``` -7. **列出文件并按大小排序**:列出`work_area/docs`目录下的所有文件,并按文件大小降序排列。 - -``` - - dddd@hecs-155801:~/work_area/docs$ ls -lhr - -``` -8. **删除所有文件**:删除`work_area/docs`目录下所有文件。 - -``` - - /work_area/docs$ sudo rm *.txt - -``` -9. **删除目录**:假设您不再需要`work_area/project_b`目录及其所有内容,请递归地强制删除它。 - -``` - - dddd@hecs-155801:~/work_area$ rm -rf project_b - -``` -10. **清理空目录**:清理`work_area`目录,删除其中所有的空目录(注意:不要删除非空的目录)。 - - ``` - find work_area -type d -empty -delete - ``` -11. **创建别名**:回到您的家目录,并创建一个别名`llh`,该别名能够列出当前目录下文件和目录的长格式列表,并以人类可读的格式显示文件大小(类似于`ls -lh`命令)。 -vim .bashrc -alias llh='ls -lh' -``` - - - -``` - - -``` -````