1. Shell 脚本
Shell脚本是一种使用Shell编写的脚本,它可以在 Linux 系统中执行各种任务。
1.1 变量
声明变量: 使用
export命令声明变量。1
export 变量名
修改变量: 在子 Shell 中修改变量,相当于创建了一个新的变量,不会影响父 Shell 中的变量。
删除变量: 使用
unset命令删除变量。1
unset 变量名
声明类型: 使用
declare命令声明变量的类型。1
2
3declare -i 变量名 # 声明整型变量
declare -r 变量名 # 声明只读变量
declare -x 变量名 # 声明环境变量
1.2 特殊变量
- $:
$符号用于引用特殊变量。 - **$?**:
$?用于获取上一个命令的退出状态码。 - **$-**:
$-用于获取当前 Shell 的选项。 - **$#**:
$#用于获取传递给脚本的参数个数。 - $$:
$$用于获取当前 Shell 的进程 ID。 - **$_**:
$_用于获取前一条命令的最后一个参数。 - **${!变量名}**:
${!变量名}用于获取变量的值。
1.3 间接引用
- **
${变量名}**: 使用${变量名}进行间接引用,可以访问变量的值。
1.4 逻辑运算符
- **${a:-b}**: 如果
a为空,则使用b。 - **${a:=b}**: 如果
a为空,则将b赋值给a。 - **${a:?b}**: 如果
a为空,则将b写入标准错误并退出。 - **${a:+b}**: 如果
a为空,则返回空字符串,否则返回b。
1.5 文件操作

- 文件存在:
test -e 文件名 - 文件不存在:
test ! -e 文件名 - 文件可读:
test -r 文件名 - 文件可写:
test -w 文件名 - 文件可执行:
test -x 文件名
1.6 数组
- 声明数组: 使用
declare -a命令声明数组。
1 | declare -a 数组名 |
- 访问数组元素: 使用
${数组名[索引]}访问数组元素。
1.7 运算
- 算术运算: 使用
expr命令进行算术运算。
1 | expr 10 + 20 |
- 条件运算: 使用
test命令进行条件运算。
1 | test $x -eq $y |
2. Shell 脚本深入扩展
Shell 脚本作为一种灵活的工具,可以应用于各种场景。

2.1 变量与参数
- 位置参数:
$1,$2,$3等用于获取传递给脚本的参数。 - 特殊参数:
$*,$@,$#等用于处理特殊参数。 $*:所有参数作为一个单词。$@:所有参数作为单独的单词。$#:传递给脚本的参数个数。- 获取命令行:
"$@"或"$*"可以获取完整的命令行。
2.2 控制流
- if 语句: 用于条件判断。
1 | if [ 条件 ]; then |
- case 语句: 用于多条件匹配。
1 | case 变量 in |
- for 循环: 用于循环遍历。
1 | for 变量 in 列表; do |
- while 循环: 用于循环直到条件为假。
1 | while [ 条件 ]; do |
2.3 函数
- 定义函数: 使用
function关键字定义函数。
1 | function 函数名() { |
- 调用函数: 使用函数名调用函数。
1 | 函数名 [参数] |
2.4 输入输出
- 读取输入: 使用
read命令读取用户输入。
1 | read 变量名 |
- 输出文本: 使用
echo命令输出文本。
1 | echo "文本内容" |
- 重定向输出: 使用
>和>>运算符将输出重定向到文件。
1 | 命令 > 文件 |
2.5 脚本结构
- 注释: 使用
#符号添加注释。 - 空白字符: 空白字符(空格、制表符等)用于分隔命令和参数。
- 管道: 使用
|运算符将一个命令的输出作为另一个命令的输入。
2.6 脚本调试
- 打印变量值: 使用
echo命令打印变量的值,用于调试。 - 设置断点: 使用
set -x命令开启调试模式,打印每条命令及其参数。
2.7 Shell 类型
- Bash: 最常用的 Shell,功能强大,易于学习和使用。
- Zsh: 功能丰富的 Shell,支持语法高亮、别名等功能。
- Ksh: 类似于 Bash,但有一些不同的特性。
3. 强大的文本处理工具awk
awk是一种强大的文本处理工具,它可以将文本文件视为由记录和字段组成的数据流,并允许用户对数据进行复杂的操作。

3.1 基本概念
- 记录(Record): 每一行文本都是一个记录。记录通常由换行符分隔。
- 字段(Field): 每个记录由多个字段组成,字段通常由空白字符(空格、制表符等)分隔。
- 字段分隔符(FS): 默认的字段分隔符是空白字符,可以使用
-F选项指定其他分隔符,例如-F,使用逗号作为分隔符。 - 模式匹配(Pattern):
awk可以根据模式匹配特定的记录。 - 动作(Action): 对匹配的记录执行的动作,通常涉及输出或修改数据。
3.2 语法
1 | awk [选项] '模式 {动作}' 文件... |
- 选项: 用于指定
awk的行为,例如-F指定字段分隔符。 - 模式: 用于匹配记录,可以是正则表达式或比较操作符。
- 动作: 对匹配的记录执行的操作,可以是输出、打印、修改等。
3.3 基本用法


- 打印所有记录:
1 | awk '{print}' 文件 |
- 打印第 1 列:
1 | awk -F '\t' '{print $1}' 文件 |
- 打印第二列大于 10 的记录:
1 | awk -F '\t' '$2 > 10 {print}' 文件 |
- 计算所有记录的总和:
1 | awk -F '\t' '{sum += $2} END {print sum}' 文件 |
- 打印包含特定单词的记录:
1 | awk '/特定单词/ {print}' 文件 |
3.4 高级用法
- 嵌套模式: 可以使用多个模式进行嵌套匹配。
- 循环和条件语句:
awk支持循环和条件语句,可以执行更复杂的操作。 - 内置函数:
awk提供了大量的内置函数,例如length(),sqrt(),strftime()等。 - 用户定义函数: 可以编写自己的函数,并将其添加到
awk脚本中。
4. awk扩展用法与高级特性
4.1 复杂模式匹配
awk 支持正则表达式,这使得模式匹配更加灵活。可以使用 ~ 和 !~ 运算符来分别匹配和排除正则表达式。
1 | # 打印包含特定模式的记录 |
4.2 字段引用
awk 提供了多种字段引用方式,包括直接引用 $1, $2, $3 等,以及使用 NF(字段总数)、$0(整个记录)和 NR(记录数)等特殊变量。
1 | # 打印所有记录的第三列 |
4.3 数组和关联数组
awk 支持数组和关联数组,可以用来存储和操作复杂的数据结构。
1 | # 初始化一个关联数组 |
4.4 流控制语句
awk 支持循环和条件语句,如 for, while, if 等。
1 | # 使用 for 循环遍历数组 |
4.5 内置变量和函数
awk 提供了大量的内置变量和函数,可以用于字符串操作、数学运算、日期处理等。
1 | # 使用内置函数 split |
4.6 用户定义变量和函数
可以在 awk 脚本中定义自己的变量和函数。
1 | awk ' |
4.7 处理二进制数据
awk 可以处理二进制文件,使用 -b 选项。
1 | awk -b '{print $0}' 二进制文件 |
4.8 嵌套 awk 脚本
可以使用一个 awk 脚本作为另一个 awk 脚本的输入。
1 | awk '{ |
5. awk在shell脚本中的使用
awk在 shell 脚本中是非常有用的,因为它可以用于处理和转换文本数据,这在脚本编写中是非常常见的任务。
5.1 简单文本处理
在 shell 脚本中,可以使用 awk 来执行简单的文本处理任务,比如打印文件的每一行。
1 |
|
5.2 字段提取
awk 可以用来提取文本文件的特定列。
1 |
|
5.3 数据过滤
使用 awk 可以根据条件过滤数据。
1 |
|
5.4 数据计算
awk 可以用来对数据进行数学计算。
1 |
|
5.5 数据排序
awk 可以用来对数据进行排序。
1 |
|
5.6 数据转换
awk 可以用来转换数据格式。
1 |
|
5.7 复杂数据处理
在更复杂的脚本中,awk 可以嵌入在循环或条件语句中,进行更复杂的数据处理。
1 |
|
5.8 作为子shell
在 shell 脚本中,可以将 awk 命令放在子shell中执行,以避免在后台执行。
1 |
|
注意事项
- 当在 shell 脚本中使用
awk时,确保文件名和变量名没有特殊字符,或者使用引号将其引起来,以避免解析错误。 - 使用
IFS(内部字段分隔符)可以改变字段分隔符,这在处理包含空格的文件名时非常有用。 - 在处理大量数据时,
awk可能会消耗大量内存,特别是在进行复杂的数据处理时。
6. 强大的文本处理工具sed
sed(Stream Editor)是一个强大的文本处理工具,它允许用户对文本进行编辑、转换、过滤等操作,而不需要直接对原始文件进行修改。sed处理的是文本流,通常来自文件或标准输入(stdin)。
6.1 基本概念
- 流编辑:
sed是一个流编辑器,它一次处理一行文本。 - 命令行编辑:
sed可以在命令行上直接编辑文本,也可以从文件中读取文本。 - 模式匹配:
sed可以基于模式来选择文本行进行操作。 - 替换:
sed的主要功能之一是替换文本。
6.2 语法
1 | sed [选项] [命令] [输入文件] |
- 选项:用于指定
sed的行为,例如-n用于抑制默认的自动打印。 - 命令:用于指定对文本进行的操作,如
p(打印)、s(替换)等。 - 输入文件:指定输入文件名,也可以是
-'来表示从标准输入读取。
6.3 基本用法
- 打印匹配模式的行:
1 | sed -n '/模式/p' 文件 |
- 替换文本:
1 | sed 's/旧文本/新文本/g' 文件 |
这里,s 是替换命令,/旧文本/ 是被查找的模式,/新文本/ 是要替换的文本,g 是全局替换标志。
6.4 高级用法
- 删除行:
1 | sed '/模式/d' 文件 |
这里,d 是删除命令。
- 添加行:
1 | sed '/模式/i 添加的文本' 文件 |
这里,i 是插入命令。
- 替换并打印:
1 | sed '/模式/s/旧文本/新文本/g' 文件 |
这里,p 命令会打印替换后的行。
注意事项
sed的替换操作默认只替换每行的第一个匹配项。要替换所有匹配项,需要使用全局替换标志g。sed的模式匹配是按行进行的,如果模式包含换行符,需要特别处理。sed的命令可以链式组合,形成复杂的文本处理流程。
7. sed的扩展用法与高级特性
7.1 使用地址范围
sed 允许你指定地址范围,这意味着你可以对文本中的特定行或行范围进行操作。
- 指定单行:
1 | sed '3p' 文件 # 打印第三行 |
- 指定多行范围:
1 | sed '1,3p' 文件 # 打印第一行到第三行 |
- 反向指定:
1 | sed '3,$p' 文件 # 打印第三行到文件末尾 |
7.2 使用正则表达式
sed 支持复杂的正则表达式,这使得模式匹配更加灵活。
- 使用正则表达式进行匹配:
1 | sed '/[0-9]\+/p' 文件 # 打印包含一个或多个数字的行 |
- 使用括号分组:
1 | sed 's/\([0-9]\+\)/\1 square/s' 文件 # 将数字替换为其平方 |
7.3 使用宏和函数
sed 允许你定义宏和函数,这使得你可以重用代码。
- 定义宏:
1 | sed -E '/pattern/{x;N;G;}' 文件 # 使用宏处理多行文本 |
- 使用函数:
1 | sed -E '{ |
7.4 使用管道和重定向
sed 可以与其他命令结合使用,通过管道(|)和重定向(>)进行更复杂的文本处理。
- 使用管道:
1 | cat 文件 | sed 's/old/new/g' # 将 cat 命令的输出通过 sed 处理 |
- 使用重定向:
1 | sed 's/old/new/g' 文件 > 新文件 # 将 sed 的输出重定向到新文件 |
7.5 使用 sed 进行文本转换
sed 可以用来进行各种文本转换,如转换行结束符、替换字符等。
- 转换行结束符:
1 | sed 's/\r$//' 文件 # 将 Windows 行结束符 (\r\n) 转换为 Unix 行结束符 (\n) |
- 替换字符:
1 | sed 's/字符1/字符2/g' 文件 |
7.6 使用 sed 进行批量操作
sed 可以用于批量操作,比如同时替换多个模式。
1 | sed -E '{ |
8. sed在shell脚本的使用
在shell脚本中使用
sed可以极大地提高脚本处理文本数据的能力。
8.1 替换文本
在脚本中,可以使用sed来替换文件中的文本。
1 |
|
这里,-i选项表示直接修改文件,s/old/new/g是替换命令,表示替换所有出现的’old’为’new’。
8.2 条件替换
有时候你可能只想替换符合特定条件的文本。
1 |
|
8.3 复合命令
在脚本中,你可以将多个sed命令组合起来。
1 |
|
这里,-n抑制了默认的自动打印,p命令用来打印匹配的行。
8.4 过滤输出
使用sed过滤不需要的输出。
1 |
|
8.5 文本提取
从文本中提取特定信息。
1 |
|
8.6 删除行
删除文件中的特定行。
1 |
|
8.7 增加行
在文件的特定位置增加行。
1 |
|
8.8 文件替换
在脚本中替换多个文件中的文本。
1 |
|
注意事项
- 使用
-i选项时,sed会直接修改文件。如果你不确定替换结果,可以先使用sed的输出功能来查看将要进行的修改。 - 在使用
sed进行替换时,注意转义字符的使用。例如,如果文本中包含斜杠/,你需要用双斜杠//来转义。 - 如果你的模式或替换文本包含空格,确保它们被引号包围,以避免shell解释错误。