编辑器及脚本案例
文章目录
- sed编辑器
- 1.sed编辑器概念
- 2.sed编辑器工作流程
- 处理大文件较卡问题
- 3.sed编辑器用法
- 命令格式
- 常用选项
- 常用操作
- awk编辑器
- 1.概念
- 2.工作原理
- 3.用法
- 命令格式
- 常用选项
- 常见的内建变量
- 脚本案例
- 1.自动备份文件或目录:
- 2.批量重命名文件:
- 3.批量删除文件
- 4.查找并删除指定名称的文件:
- 5.查找并替换文件内容:
- 6.批量创建文件:
- 7.创建文件夹并移动文件:
- 8.在文件夹中查找文件:
- 9.计算文件夹中文件数量:
- 10.计算文件夹大小:
- 11.定时执行命令:
- 12.发送邮件:
- 13.批量解压缩文件:
- 14.在文件夹中查找并删除文件:
- 15.批量重命名文件:
- 16.对文件夹中的文件按修改时间排序:
- 17.批量转换文件格式:
- 18.删除文件夹中的空文件夹:
- 19.删除文件夹中的空文件:
- 20.批量更改文件权限:
sed编辑器
1.sed编辑器概念
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储一个命令文本文件中。
2.sed编辑器工作流程
sed 的工作流程主要包括读取、执行和显示三个过程:
读取:sed从输入流(文件、管道、标准输入〉中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则临时sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
处理大文件较卡问题
流编辑器处理大文件比较卡可以使用两种方式来处理。sed命令将大文件分成若干个小文件读取。或者使用**cat
命令读取全部文件放在临时缓冲区中,然后交给流编辑器(grep、sed、awk)进行处理**,由于使用cat命令时IO消耗比较低。
3.sed编辑器用法
命令格式
sed -e '操作' 文件l 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...sed -e 'n{ #n意为:指定行
操作l
操作2
...
}' 文件1 文件2 ...
常用选项
选项 | 含义 |
---|---|
-e 或--expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用。 |
-f 或--file= | 表示用指定的脚本文件来处理输入的文本文件。 |
-h 或--help | 显示帮助。 |
-n 、--quiet 或silent | 禁止sed编辑器输出,但可以与p 命令一起使用完成输出。 |
-i | 直接修改目标文本文件。 |
-r, --regexp-extended | 支持正则表达式 |
常用操作
操作 | 含义 |
---|---|
s | 替换,替换指定字符。 |
d | 删除,删除选定的行。 |
a | 增加,在当前行下面增加一行指定内容。 |
i | 插入,在选定行上面插入一行指定内容。 |
c | 替换,将选定行替换为指定内容。 |
y | 字符转换,转换前后的字符长度必须相同。 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果有非打印字符,则以ASCII码输出。其通常与-n 选项一起使用。 |
= | 打印行号。 |
l (小写L) | 打印数据流中的文本和不可打印的AscII字符(比如结束符$ 、制表符\t ) |
awk编辑器
1.概念
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print
的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符 &&
表示与、||
表示或、!
表示非;还可以进行简单的数学运算,如+
、-
、*
、/
、%
、^
分别表示加、减、乘、除、取余和乘方。
2.工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
3.用法
命令格式
awk 选项 '模式或条件 {操作}' 文件1 文件2 ...
awk -f 脚本文件 文件l 文件2 ...
常用选项
-F 指定分隔符
awk -F ',' '{print}' file1
常见的内建变量
内建变量 | 含义 |
---|---|
FS | 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与-F 作用相同。 |
NF | 当前处理的行的字段个数。$NF 代表最后一个字段。 |
NR | 当前处理的行的行号(序数)。 |
$0 | 当前处理的行的整行内容。 |
$n | 当前处理行的第n个字段(第n列)。 |
FILENAME | 被处理的文件名。 |
RS | 行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录,而awk比较倾向于将一行分成多个一次仅读入一条记录,以进行处理。预设值是\n 。 |
脚本案例
1.自动备份文件或目录:
#!/bin/bash
#设置备份目录
bachup_dir="/path/to/backup/dir"
#设置要备份的文件或目录
files_to_backup="/path/to/files /path/to/dir"
#创建一个日期时间戳
timestamp=$(date +%F_%T)
#备份文件
tar -crzf "${bachup_dir}/backup_${timestamp}.tar.gz" ${files_to_backup}
2.批量重命名文件:
#!/bin/bash
# 设置文件扩展名
file=$(find . -type f -name "*.txt"
read -p"请输入修改后的文件名:" NAME
if [ $NAME =~ $file]; then
mv $file $NAME
fi0
bash $0
3.批量删除文件
#!/bin/bash
find ./ -type f -exec rm -rf{} \;
4.查找并删除指定名称的文件:
#!/bin/bash
read -p "请输入需要删除的文件名:" NAME
find $NAME
if [ $? -eq 0 ];then
rm -rf $NAME
fi
5.查找并替换文件内容:
#!/bin/bash# 设置要查找的字符串
search_string="old_string"# 设置要替换成的字符串
replace_string="new_string"# 查找并替换文件内容
find . -type f -exec sed -i "s/${search_string}/${replace_string}/g" {} \;
6.批量创建文件:
#!/bin/bash# 设置文件名前缀
prefix="file"# 设置文件数量
num_files=10# 循环创建文件
for i in $(seq 1 ${num_files})
dotouch "${prefix}${i}.txt"
done
7.创建文件夹并移动文件:
#!/bin/bash
# 设置文件夹名称
dir_name="new_dir"# 设置要移动的文件
files_to_move="file1.txt file2.txt"
# 创建文件夹并移动文件
mkdir ${dir_name} && mv ${files_to_move} ${dir_name}
8.在文件夹中查找文件:
#!/bin/bash# 设置文件夹路径
dir_path="/path/to/dir"# 设置文件名
filename="example.txt"# 在文件夹中查找文件
find ${dir_path} -name "${filename}"
9.计算文件夹中文件数量:
#!/bin/bash
# 设置文件夹路径
dir_path="/path/to/dir"# 计算文件数量
num_files=$(find ${dir_path} -type f | wc -l)echo "Number of files in ${dir_path}: ${num_files}"
10.计算文件夹大小:
#!/bin/bash
read -p "请输入需要.计算文件夹大小:" file
#计算文件夹大小
du -sh $file
11.定时执行命令:
#!/bin/bash# 设置命令
command="echo hello"# 设置执行周期(以秒为单位)
period=10# 定时执行命令
while true
doeval ${command}sleep ${period}
done
12.发送邮件:
#!/bin/bash
mail -s
13.批量解压缩文件:
#!/bin/bashcase "$file" in*.zip)unzip -q "$file" -d "$base_name";;*.tar|*.tar.gz|*.tgz|*.tar.bz2|*.tbz2)tar xf "$file" -C "$base_name";;*.gz)base_file=$(basename "$file")new_file="${base_file%.gz}" # 去掉最后一个扩展名(.gz)mkdir -p "$base_name"gzip -d -c "$file" > "$base_name/$new_file";;esac
14.在文件夹中查找并删除文件:
#!/bin/bash# 设置文件夹路径
dir_path="/path/to/dir"# 设置文件名
filename="example.txt"# 在文件夹中查找文件
find ${dir_path} -name "${filename}"# 删除文件
rm -rf "${filename}"
15.批量重命名文件:
#!/bin/bash# 设置文件扩展名
extension=".old"# 设置新文件扩展名
new_extension=".new"# 遍历当前目录下的所有文件
for file in *${extension}
do# 获取文件名(不包含扩展名)filename=$(basename "${file}" "${extension}")# 重命名文件mv "${file}" "${filename}${new_extension}"
done
16.对文件夹中的文件按修改时间排序:
ls -t
17.批量转换文件格式:
#!/bin/bash# 设置文件扩展名
extension=".txt"# 设置新文件扩展名
new_extension=".md"# 遍历当前目录下的所有文件
for file in *${extension}
do# 转换文件格
pandoc -s "${file}" -o "${file/${extension}/${new_extension}}"
done注意:需要先安装Pandoc。
18.删除文件夹中的空文件夹:
#!/bin/bash# 设置文件夹路径
dir_path="/path/to/dir"# 删除文件夹中的空文件夹
find ${dir_path} -type d -empty -delete
19.删除文件夹中的空文件:
#!/bin/bash# 设置文件夹路径
dir_path="/path/to/dir"# 删除文件夹中的空文件
find ${dir_path} -type f -empty -delete
20.批量更改文件权限:
#!/bin/bash# 设置文件夹路径
dir_path="/path/to/dir"
read -p "输入要更改文件的权限:"permission
if [[ "$permission" =~ ^[0-7]{3}$ ]];then
# 批量更改文件权限
find ${dir_path} -type f -exec chmod ${permission} {} \;
elseecho "错误:无效的权限值 '$permission',必须是3位八进制数字(0-7)"fi