awk
命令用法表格
场景 | 命令示例 | 说明 | 示例输入文件内容 (input.txt ) | 输出结果 |
---|
1. 基础字段提取 | awk -F: '{print $1}' /etc/passwd | 按分隔符提取第1列(如用户名)。 | root:x:0:0:root:/root:/bin/bash | root |
2. 多字段组合输出 | awk -F: '{print $1, $3, $7}' /etc/passwd | 提取第1、3、7列并用空格分隔。 | 同上 | root 0 /bin/bash |
3. 条件过滤行 | awk -F: '$3 >= 1000 {print $1}' /etc/passwd | 输出UID(第3列)≥1000的用户名。 | user1:x:1000:1000:User One:/home/user1:/bin/bash | user1 |
4. 数值计算 | awk '{sum += $1} END {print sum}' numbers.txt | 计算第1列数值的总和。 | 10<br>20<br>30 | 60 |
5. 条件统计 | awk -F: '$7 == "/bin/bash" {count++} END {print count}' /etc/passwd | 统计使用 /bin/bash 的用户数。 | 同场景1 | 2 (假设有2个用户使用bash) |
6. 数组去重统计 | awk '{a[$0]++} END {for (i in a) print i, a[i]}' duplicates.txt | 统计每行出现次数并去重。 | apple<br>banana<br>apple | apple 2<br>banana 1 |
7. 自定义分隔符 | awk -F, '{print $2}' data.csv | 按逗号分隔CSV文件并提取第2列。 | John,Doe,25<br>Jane,Smith,30 | Doe<br>Smith |
8. 格式化输出 | awk -F: 'BEGIN {OFS=":"} {print $1, "NEW", $3}' /etc/passwd | 修改输出分隔符为冒号,并在第2列插入NEW 。 | 同场景1 | root:NEW:0 |
9. 匹配正则表达式 | awk '/error/ {print}' logfile.txt | 输出包含error 的行。 | [INFO] Started<br>[ERROR] Failed | [ERROR] Failed |
10. 多条件组合 | awk -F: '$3 > 500 && $7 == "/bin/bash" {print $1}' /etc/passwd | 输出UID>500且使用bash的用户名。 | | |
操作符 | 作用 | 示例 |
---|
< | 输入重定向(文件 → 命令) | cat < mail.txt |
<< | Here Document(多行输入) | read a b << EOF 1 2 EOF |
<<< | Here String(单行输入) | grep "word" <<< "text" |
`> | ` | 强制覆盖输出(即使存在 noclobber |
场景 | 操作符 | 示例 | 是否需要空格 |
---|
[ ] 字符串比较 | = | [ "$var" = "value" ] | 是 |
[[ ]] 字符串比较 | == | [[ "$var" == "value" ]] | 建议加 |
变量赋值 | = | var="value" | 否 |
awk处理文本时,读文件前、读取文件内容中、读文件后后这三个环节是如何表示的?
- BEGIN{ } 文件前处理:awk没有读入行之前 要执行的动作; 一般对数据作初始化操作,可以单独使用。
- { } 行处理:对awk读入的每一行进行处理,可以单独使用。
- END{ }文件后处理:awk 把所有的行都处理完后要执行的动作,一般输出数据处理的结果。可以单独使用。
sort
命令用法表格
选项 | 说明 | 示例 | 输出说明 |
---|
无选项 | 按字典序(ASCII 顺序)对行排序 | sort file.txt | 按行首字母顺序排列 |
-n | 按数值大小排序(而非字典序) | sort -n numbers.txt | 数值从小到大排序 |
-r | 逆序排序(降序) | sort -r file.txt | 字典序或数值的逆序 |
-k | 指定排序的列(字段) | sort -k2 file.csv | 按第 2 列排序(需配合 -t 指定分隔符) |
-t | 指定字段分隔符(默认空白字符) | sort -t: -k3 /etc/passwd | 按 /etc/passwd 的第 3 列(UID)排序 |
-u | 去除重复行(保留唯一行) | sort -u duplicates.txt | 输出无重复的行 |
-o | 将排序结果输出到文件(而非标准输出) | sort file.txt -o sorted_file.txt | 将排序结果保存到 sorted_file.txt |
-V | 按版本号排序(支持 1.10 排在 1.2 之后) | sort -V versions.txt | 适用于软件版本号排序 |
-f | 忽略大小写差异 | sort -f mixedcase.txt | 将 Apple 和 apple 视为相同 |
-M | 按月份名称排序(如 Jan 、Feb ) | sort -M months.txt | 按月份顺序排列 |
[[ ]]
和 [ ]
是 shell 脚本中用于条件测试的两种语法结构,但它们在功能、安全性和灵活性上有显著区别。以下是两者的核心对比和详细说明:
1. 语法与功能差异
特性 | [[ ]] | [ ] (传统 test 命令) |
---|
支持的运算符 | 支持逻辑运算符 && 、` | |
单词拆分与引号处理 | 变量中的空格不会被拆分,无需额外引号(如 [[ $var == *txt ]] 安全)。 | 未加引号的变量可能导致单词拆分或通配符意外展开(如 [ $var = *.txt ] 可能报错)。 |
正则表达式匹配 | 支持 =~ 运算符进行正则匹配(如 [[ $str =~ ^[0-9]+$ ]] )。 | 不支持正则表达式,需结合 expr 或外部工具(如 grep )。 |
变量为空时的安全性 | 空变量或未定义变量不会导致语法错误(如 [[ $var == "" ]] 安全)。 | 空变量可能导致语法错误(如 [ $var = "" ] 会报 [: =: unary operator expected )。 |
兼容性 | Bash、Zsh、Ksh 等现代 shell 支持,非 POSIX 标准。 | 所有 POSIX 兼容 shell(如 Dash、Bash 的 POSIX 模式)均支持。 |
3. 何时使用哪种语法?
场景 | 推荐语法 | 原因 |
---|
现代 Bash/Zsh 脚本 | [[ ]] | 更安全、功能更丰富,避免转义和引号问题。 |
需要兼容 POSIX shell(如 Dash) | [ ] | 确保脚本在最小化环境中运行(如 Docker 的 /bin/sh 可能是 Dash)。 |
简单数值比较 | [ ] | 在兼容性优先的场景中,[ ] 的语法更通用(如 [ "$a" -eq "$b" ] )。 |
复杂字符串/正则匹配 | [[ ]] | 仅 [[ ]] 支持通配符和正则表达式,代码更简洁。 |
4. 注意事项
[[ ]]
是 Bash 扩展:在非 Bash 环境中(如 sh
)可能不可用。[ ]
是 test
命令的别名:等价于 test "$a" = "$b"
,但需严格遵循语法。