编辑器及脚本案例

文章目录

sed编辑器

1.sed编辑器概念

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储一个命令文本文件中。

2.sed编辑器工作流程

sed 的工作流程主要包括读取执行显示三个过程:

读取 :sed从输入流(文件、管道、标准输入〉中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则临时sed命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

处理大文件较卡问题

流编辑器处理大文件比较卡可以使用两种方式来处理。sed命令将大文件分成若干个小文件读取。或者使用**cat命令读取全部文件放在临时缓冲区中,然后交给流编辑器(grep、sed、awk)进行处理**,由于使用cat命令时IO消耗比较低。

3.sed编辑器用法

命令格式
bash 复制代码
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--quietsilent 禁止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 ...
常用选项
apl 复制代码
-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})
do
  touch "${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
do
  eval ${command}
  sleep ${period}
done
12.发送邮件:
复制代码
#!/bin/bash
mail -s
13.批量解压缩文件:
复制代码
 #!/bin/bash
 case "$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} {} \;
else
        echo "错误:无效的权限值 '$permission',必须是3位八进制数字(0-7)"

fi
相关推荐
2401_873587821 小时前
Linux常见指令以及权限理解
linux·运维·服务器
Arthurmoo1 小时前
Linux系统之MySQL数据库基础
linux·数据库·mysql
李洋-蛟龙腾飞公司2 小时前
HarmonyOS NEXT应用元服务常见列表操作分组吸顶场景
linux·运维·windows
链上Sniper2 小时前
智能合约状态快照技术:实现 EVM 状态的快速同步与回滚
java·大数据·linux·运维·web3·区块链·智能合约
晨曦丿3 小时前
双11服务器
linux·服务器·网络
wanhengidc3 小时前
UDP服务器主要是指什么意思?
服务器·网络协议·udp
李迟3 小时前
在Linux服务器上使用kvm创建虚拟机
java·linux·服务器
从后端到QT3 小时前
SRS流媒体服务器(8)源码分析之rtc/rtmp互相转码详解
运维·服务器·实时音视频
A_New_World3 小时前
Linux性能分析工具
linux
鹏大师运维3 小时前
在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
linux·运维·docker·容器·麒麟·统信uos·中科方德