当前位置: 首页 > 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:输出字段分隔符,默认为空

修改输出时的字段数值 

 

相关文章:

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

函数 系统函数 常见内置命令 echo打印输出 #!/bin/bash # 输出普通文本 echo "Hello, World!"# 输出变量值 name"Alice" echo "Hello, $name"# 输出带有换行符的文本 echo -n "Hello, " # -n 选项不输出换行 echo "World!&quo…...

解决 npm xxx was blocked, reason: xx bad guy, steal env and delete files

问题复现 今天一位朋友说,vue2的老项目安装不老依赖,报错内容如下: npm install 451 Unavailable For Legal Reasons - GET https://registry.npmmirror.com/vab-count - [UNAVAILABLE_FOR_LEGAL_REASONS] vab-count was blocked, reas…...

如何进行高级红队测试:OpenAI的实践与方法

随着人工智能(AI)技术的迅猛发展,AI模型的安全性和可靠性已经成为业界关注的核心问题之一。为了确保AI系统在实际应用中的安全性,红队测试作为一种有效的安全评估方法,得到了广泛应用。近日,OpenAI发布了两…...

Java:二维数组

目录 1. 二维数组的基础格式 1.1 二维数组变量的创建 —— 3种形式 1.2 二维数组的初始化 \1 动态初始化 \2 静态初始化 2. 二维数组的大小 和 内存分配 3. 二维数组的不规则初始化 4. 遍历二维数组 4.1 for循环 ​编辑 4.2 for-each循环 5. 二维数组 与 方法 5.1…...

Android 天气APP(三十七)新版AS编译、更新镜像源、仓库源、修复部分BUG

上一篇:Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife 新版AS编译、更新镜像源、仓库源、修复部分BUG 前言正文一、更新镜像源① 腾讯源③ 阿里源 二、更新仓库源三、修复城市重名BUG四、地图加载问题五、源码 前…...

Xilinx IP核(3)XADC IP核

文章目录 1. XADC介绍2.输入要求3.输出4.XADC IP核使用5.传送门 1. XADC介绍 xadc在 所有的7系列器件上都有支持,通过将高质量模拟模块与可编程逻辑的灵活性相结合,可以为各种应用打造定制的模拟接口,XADC 包括双 12 位、每秒 1 兆样本 (MSP…...

计算机网络socket编程(2)_UDP网络编程实现网络字典

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(2)_UDP网络编程实现网络字典 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨…...

c#窗体列表框(combobox)应用——省市区列表选择实例

效果如下&#xff1a; designer.cs代码如下&#xff1a; using System.Collections.Generic;namespace 删除 {public partial class 省市区选择{private Dictionary<string, List<string>> provinceCityDictionary;private Dictionary<string,List<string&…...

Nginx 架构与设计

Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;同时也可以用作邮件代理和通用的 TCP/UDP 负载均衡器。它的架构设计以高并发、高可扩展性和高性能为目标&#xff0c;充分利用操作系统提供的多路复用机制和事件驱动模型。以下是 Nginx 的架构和设计特点&#xff1a; 1…...

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)...

多线程 相关面试集锦

什么是线程&#xff1f; 1、线程是操作系统能够进⾏运算调度的最⼩单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位&#xff0c;可以使⽤多线程对 进⾏运算提速。 ⽐如&#xff0c;如果⼀个线程完成⼀个任务要100毫秒&#xff0c;那么⽤⼗个线程完成改…...

【数据结构】—— 线索二叉树

引入 我们现在提倡节约型杜会&#xff0c; 一切都应该节约为本。对待我们的程序当然也不例外&#xff0c;能不浪费的时间或空间&#xff0c;都应该考虑节省。我们再观察团下图的二叉树&#xff08;链式存储结构)&#xff0c;会发现指针域并不是都充分的利用了&#xff0c;有许…...

uni-app 发布媒介功能(自由选择媒介类型的内容) 设计

1.首先明确需求 我想做一个可以选择媒介的内容&#xff0c;来进行发布媒介的功能 &#xff08;媒介包含&#xff1a;图片、文本、视频&#xff09; 2.原型设计 发布-编辑界面 通过点击下方的加号&#xff0c;可以自由选择添加的媒介类型 但是因为预览中无法看到视频的效果&…...

How to update the content of one column in Mysql

How to update the content of one column in Mysql by another column name? UPDATE egg.eggs_record SET sold 2024-11-21 WHERE id 3 OR id 4;UPDATE egg.eggs_record SET egg_name duck egg WHERE id 2;...

URL在线编码解码- 加菲工具

URL在线编码解码 打开网站 加菲工具 选择“URL编码解码” 输入需要编码/解码的内容&#xff0c;点击“编码”/“解码”按钮 编码&#xff1a; 解码&#xff1a; 复制已经编码/解码后的内容。...

Python3 爬虫 Scrapy的安装

Scrapy是基于Python的分布式爬虫框架。使用它可以非常方便地实现分布式爬虫。Scrapy高度灵活&#xff0c;能够实现功能的自由拓展&#xff0c;让爬虫可以应对各种网站情况。同时&#xff0c;Scrapy封装了爬虫的很多实现细节&#xff0c;所以可以让开发者把更多的精力放在数据的…...

QT中QString类的各种使用

大部分的QString使用可以参考:QT中QString 类的使用--获取指定字符位置、截取子字符串等_qstring 取子串-CSDN博客 补充一种QString类的分离:Qt QString切割(Split()与Mid()函数详解)_qstring split-CSDN博客 1. Trimmed和Simplified函数(去除空白) trimmed&#xff1a;去除了…...

linux 网络安全不完全笔记

一、安装Centos 二、Linux网络网络环境设置 a.配置linux与客户机相连通 b.配置linux上网 三、Yum详解 yum 的基本操作 a.使用 yum 安装新软件 yum install –y Software b.使用 yum 更新软件 yum update –y Software c.使用 yum 移除软件 yum remove –y Software d.使用 yum …...

uniapp将图片url转换成base64支持app和h5

uniapp将图片url转换成base64支持app和h5 imageToBase64支持app和h5, app内使用plus.io.resolveLocalFileSystemURL方法转换 h5内使用uni.request方法转换 // 图片转base64 export const imageToBase64 (path) > {// #ifdef APP-PLUSreturn new Promise((resolve, rejec…...

odoo17 档案管理之翻译2

翻译格式&#xff1a;#: model_terms:对象名称,arch_db:模块名.xml_id #. module: dms #: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban #: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban #: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...