【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"; then
    echo "文件 /etc/passwd 存在"
else
    echo "文件 /etc/passwd 不存在"
fi

# 字符串测试
str="hello"
if test "$str" = "hello"; then
    echo "字符串匹配"
else
    echo "字符串不匹配"
fi

# 数字比较
a=5
b=10
if test $a -lt $b; then
    echo "$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_function1

my_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 ]; then
        return 0  # 返回0表示成功
    else
        return 1  # 返回1表示失败
    fi
}

check_positive 10
if [ $? -eq 0 ]; then
    echo "Positive number"
else
    echo "Non-positive number"
fi

错误处理

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

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 ]; then
        echo 1
    else
        prev=$(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_debug

set +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:输出字段分隔符,默认为空

修改输出时的字段数值 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922677.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素: 性能需求。根据网站的预期流量和负载情况,选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构,以便…

LeetCode 904.水果成篮

LeetCode 904.水果成篮 思路🧐: 求水果的最大数目,也就是求最大长度,我们是单调的向前求解,则能够想到使用滑动窗口进行解答,可以用hash表统计每个种类的个数,kinds变量统计当前种类&#xff0c…

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…

小程序免备案:快速部署与优化的全攻略

小程序免备案为开发者提供了便捷高效的解决方案,省去繁琐的备案流程,同时通过优化网络性能和数据传输,保障用户体验。本文从部署策略、应用场景到技术实现,全面解析小程序免备案的核心优势。 小程序免备案:快速部署与优…

L14.【LeetCode笔记】返回倒数第k个节点

目录 1.题目 2.分析 思路 代码 提交结果 1.题目 面试题 02.02. 返回倒数第 k 个节点 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 …

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中,处理 Excel 文件的导入导出是极为常见的需求。 今天,咱们就一起来深入了解一款非常实用的操作 Exce…

基于Java Springboot高校教室资源管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库:…

k8s1.31版本最新版本集群使用容器镜像仓库Harbor

虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…

C语言数据结构学习:循环队列

C语言 数据结构学习 汇总入口: C语言数据结构学习:[汇总] 1. 循环队列 队列的博客:C语言数据结构学习:队列 循环队列会预先定义最大队列空间,然后定义一个数组,通过队列头和队列尾指针分别指向开头和结尾&…

Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5,你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址:https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新不易,希望走过路…

Redis 常用数据类型插入性能对比:循环插入 vs. 批量插入

Redis 是一款高性能的键值数据库,其支持多种数据类型(String、Hash、List、Set、ZSet、Geo)。在开发中,经常会遇到需要插入大量数据的场景。如果逐条插入,性能会显得较低,而采用 Pipeline 批量插入 能大幅提…

oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist

oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程: OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…

node.js中使用express.static()托管静态资源

express.static()定义 express.static(root, [options])是一个中间件函数,负责为Express应用提供静态资源服务。它允许你指定一个或多个目录作为静态资源的根目录,当客户端请求这些资源时,Express会查找并返回对应的文件。 安装express npm i…

【含开题报告+文档+PPT+源码】基于SSM的社区老人服务系统设计与实现

开题报告 在当前人口老龄化趋势明显以及信息化社会发展背景下,基于 SSM 框架构建的社区老人服务系统具有深远的背景意义。首先,它响应了我国老龄化进程加快所带来的多元化、个性化养老服务需求,利用互联网技术为老年人提供便捷高效的在线申请…

Spring AI 框架使用的核心概念

一、模型(Model) AI 模型是旨在处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和见解,这些模型可以做出预测、文本、图像或其他输出,从而增强各个行业的各种应用。 AI 模型有很多种&…

学习与理解LabVIEW中多列列表框项名和项首字符串属性

多列列表框控件在如下的位置: 可以对该控件右击,如下位置,即可设置该控件的显示项: 垂直线和水平线指的是上图中组成单元格的竖线和横线(不包括行首列首) 现在介绍该多列列表框的两个属性,分别…

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么

今天学Flink的关键技术–容错机制,用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点(checkpoint) Flink容错机制的核心是分布式数据流和状态的快照,从而当分布…