自学内容网 自学内容网

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

修改输出时的字段数值 

 


原文地址:https://blog.csdn.net/gma999/article/details/143977762

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!