当前位置: 首页 > news >正文

【shell编程】函数、正则表达式、文本处理工具

函数

系统函数

常见内置命令

echo打印输出

#!/bin/bash
# 输出普通文本
echo "Hello, World!"# 输出变量值
name="Alice"
echo "Hello, $name"# 输出带有换行符的文本
echo -n "Hello, "  # -n 选项不输出换行
echo "World!"

cd :改变当前工作目录 ; pwd:打印当前目录

#!/bin/bash
# 显示当前目录
echo "当前目录: $(pwd)"# 改变到 home 目录
cd ~
echo "已切换到 Home 目录: $(pwd)"# 返回上一级目录
cd ..
echo "返回上一级目录: $(pwd)"

exit:退出脚本返回一个状态码

#!/bin/bash
echo "脚本即将退出"
exit 0  # 退出脚本并返回状态码 0(表示成功)

read:读取用户输入

#!/bin/bash
echo "请输入你的名字:"
read name
echo "你好, $name"

test - 条件测试

#!/bin/bash
# 文件存在性测试
if test -e "/etc/passwd"; thenecho "文件 /etc/passwd 存在"
elseecho "文件 /etc/passwd 不存在"
fi# 字符串测试
str="hello"
if test "$str" = "hello"; thenecho "字符串匹配"
elseecho "字符串不匹配"
fi# 数字比较
a=5
b=10
if test $a -lt $b; thenecho "$a 小于 $b"
fi

常用外部命令

即常见的Linux服务器命令,下面对于常用的做出总结

ls :列出指定目录中的文件和子目录

cat : 查看文件内容 

 grep:搜索文本

也可以在脚本中写

#!/bin/bash
# 在文件中查找包含 "hello" 的行
grep "hello" file.txt

awk : 文本处理

sed :流编译器

#!/bin/bash
# 替换文件中的 "hello" 为 "hi"
sed 's/hello/hi/' file.txt# 删除文件中包含 "world" 的行
sed '/world/d' file.txt

find:查找文件

#!/bin/bash
# 在当前目录下查找所有以 ".txt" 结尾的文件
find . -name "*.txt"# 查找最近 5 天内修改过的文件
find . -mtime -5

tar :压缩和解压

#!/bin/bash
# 创建一个 tar 包
tar -cvf archive.tar file1.txt file2.txt# 解压 tar 包
tar -xvf archive.tar

自定义函数

基本语法

# 方法1:使用 `function` 关键字
function my_function() {echo "Hello, World!"
}# 方法2:省略 `function` 关键字
my_function() {echo "Hello, World!"
}

# 方法1:使用 `function` 关键字
function my_function1() {echo "Hello, World!"
}# 方法2:省略 `function` 关键字
my_function2() {echo "Hello, World!"
}my_function1my_function2

函数参数

shell函数通过位置参数$1 $2等来使用参数

greet() {echo "Hello, $1! You are $2 years old."
}greet "Alice" 25  # 输出:Hello, Alice! You are 25 years old.

 参数数量获取:通过 $#获取传递给函数的参数个数

count_args() {echo "Number of arguments: $#"
}count_args 1 2 3 

返回值与错误处理

 直接通过echo进行返回值

add() {result=$(( $1 + $2 ))echo $result
}sum=$(add 5 3)
echo "Sum is: $sum"  # 输出:Sum is: 8

return返回状态码

  •  $? 存储的是上一个命令或函数的退出状态

check_positive() {if [ $1 -gt 0 ]; thenreturn 0  # 返回0表示成功elsereturn 1  # 返回1表示失败fi
}check_positive 10
if [ $? -eq 0 ]; thenecho "Positive number"
elseecho "Non-positive number"
fi

错误处理

check_error() {if [ $1 -lt 0 ]; thenecho "Error: Negative number!" >&2exit 1fi
}check_error -1  

区部变量和全局变量

使用局部变量

  •  local关键字限制变量在函数内部有效
  • 如果没有使用local,变量将是全局的,函数外部也可以访问

example() {local var="I am local"echo $var
}example 
echo $var 

全局变量

  • 函数内部不使用local,则变量会变成全局变量,函数外部也能访问

global_example() {global_var="I am global"
}global_example
echo $global_var  

递归函数

factorial() {if [ $1 -le 1 ]; thenecho 1elseprev=$(factorial $(( $1 - 1 )))echo $(( $1 * prev ))fi
}result=$(factorial 5)
echo "Factorial of 5 is: $result"  

函数调试

  • set -xset +x 允许你跟踪函数内部的执行过程

set -x  # 开启调试模式,显示每行命令及其执行结果example_debug() {echo "This is a debug example"echo "Another line"
}example_debugset +x  # 关闭调试模式

正则表达式

常规匹配

点号.:a.b将匹配任意字符(除了换行符)位于ab之间的字符串

方括号 [] (匹配字符集中的任意一个字符):例如[aeiou]匹配任何一个元音字母(aeiou

apple
banana
grape
pear
orange
umbrella

插入符号 ^ (匹配行的开始):用来匹配以特定字符串开头的行

apple pie
banana split
apple tart
grape fruit
apple cider

$:匹配行结束,主要用来匹配特定字符串结尾的行

apple pie
banana tart
apple tart
grape tart
orange juice

 |:示逻辑“或”操作符,匹配任意一个模式

apple
banana
carrot
grape
cucumber
orange

*:例如a*匹配零个或者多个a 

+:匹配前一个字符或者多个

常用特殊字符

\:转移字符

  • \.\*\+
  • 用于转义字符,使它们失去特殊意义,变为字面量字符。例如,.通常匹配任意字符,但如果你想匹配一个字面量的点,可以使用 \.

():分组和捕获

  • 语法(abc|def)
  • 说明:圆括号用于创建分组。它们可以帮助你将一部分模式组合在一起,从而作为一个整体来进行匹配

apple pie
banana split
grape fruit
apple tart
orange juice

 {}:量词

  • 语法a{n,m}a{n}
  • 说明:大括号用于指定前一个字符出现的次数。例如,a{2,4}匹配2到4个a,而a{3}只匹配正好3个a

aa
aaa
aaaa
aaaaa

文本处理工具

cut

概述

用于从文本文件中提取字段、列或字符,可以通过指定分隔符、字段范围、字符位置等来灵活提取所需的数据

常用选项

  • -f:选择字段。
  • -d:指定分隔符。
  • -c:选择字符位置。
  • --complement:选择除了指定字段之外的所有字段。
  • -s:只显示包含分隔符的行。

基本语法

cut OPTION... [FILE]...

常用选项和用法

-f:选择字段

  • 语法cut -f FIELD
  • -f 用来指定要提取的字段。字段是通过分隔符(默认是制表符)来划分的
  • -d ',' 用来指定字段的分隔符是逗号,而 -f 1,3 表示提取第一列和第三列
  • 注意文中如果有其他注释会失效

-d:指定分隔符

  • 语法cut -d DELIM
  • 使用 -d 选项来指定字段分隔符,默认为制表符。你可以将其设置为其他字符(如逗号、空格等)

-c:按字符位置选择

  • 语法cut -c N
  • 使用 -c 选项根据字符位置选择字段。你可以选择一个或多个字符位置进行提取
  • 提取每一行的前三个字符

 --complement:选择非指定字段

  • 语法cut --complement
    使用 --complement 选项选择除指定字段之外的所有字段
  • 使用 cut 提取除了第一列和第三列之外的所有列

 -s:只显示有分隔符的行

  •  语法cut -s
  • 使用 -s 选项来排除没有分隔符的行

awk

概述

基本语法

awk 'pattern { action }' input_file
  • pattern:用于匹配的模式(正则表达式)。如果省略,则 awk 会对每一行都执行动作
  • action:在模式匹配后执行的操作。如果省略,则默认打印匹配的行
  • input_file:要处理的输入文件。如果不指定,awk 会从标准输入读取数据

常用选项

打印整行内容

  • awk 会打印所有匹配行。只给出 awk '{ print }' 就会打印每一行

 打印指定字段

  • awk 将每一行默认按空格或制表符分割成字段,字段可以通过 $n 访问,其中 n 是字段的数字(从 1 开始)。$1 表示第一字段,$2 表示第二字段,依此类推

使用分隔符 -F

  • 默认情况下,awk 使用空格和制表符作为字段分隔符。你可以使用 -F 选项指定其他分隔符

条件判断

基础运算

BEGIN END

  • BEGINEND 是特殊的块,用来在处理文本前或后执行操作。BEGIN 用于在处理前执行,END 用于在处理后执行

结合正则表达式使用

内置变量的使用

  • NR:表示当前记录(行)的编号
  • NF:表示当前行的字段数
  • FS:字段分隔符,默认为空格或制表符
  • OFS:输出字段分隔符,默认为空

修改输出时的字段数值 

 

http://www.lryc.cn/news/491044.html

相关文章:

  • 解决 npm xxx was blocked, reason: xx bad guy, steal env and delete files
  • 如何进行高级红队测试:OpenAI的实践与方法
  • Java:二维数组
  • Android 天气APP(三十七)新版AS编译、更新镜像源、仓库源、修复部分BUG
  • Xilinx IP核(3)XADC IP核
  • 计算机网络socket编程(2)_UDP网络编程实现网络字典
  • c#窗体列表框(combobox)应用——省市区列表选择实例
  • Nginx 架构与设计
  • python Flask指定IP和端口
  • 多线程 相关面试集锦
  • 【数据结构】—— 线索二叉树
  • uni-app 发布媒介功能(自由选择媒介类型的内容) 设计
  • How to update the content of one column in Mysql
  • URL在线编码解码- 加菲工具
  • Python3 爬虫 Scrapy的安装
  • QT中QString类的各种使用
  • linux 网络安全不完全笔记
  • uniapp将图片url转换成base64支持app和h5
  • odoo17 档案管理之翻译2
  • 风尚云网前端学习:制作一款简易的在线计算器
  • Android蓝牙架构,源文件目录/编译方式学习
  • ubuntu中使用ffmpeg和nginx推流rtmp视频
  • strongswan测试流程
  • [CKS] CIS基准测试,修复kubelet和etcd不安全项
  • Linux/Windows/OSX 上面应用程序重新启动运行。
  • React拆分组件中的传值问题
  • RocketMQ的使⽤
  • Android Studio 设置不显示 build-tool 无法下载
  • 【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)
  • 细说敏捷:敏捷四会之standup meeting