shell小记

本文详细讲解了Bash脚本中变量替换、测试(包括字符串长度、索引、匹配和子串抽取)、命令替换、类型变量、数学运算,以及函数定义、传参、返回值、全局与局部变量和函数库等内容,还涉及文件查找技巧如find、locate、whereis和which。深入浅出地介绍了grep、sed和awk在文本处理中的应用。
摘要由CSDN通过智能技术生成

1.变量

1.1变量替换和测试

如果手边不方便的话,可以使用在线的shell编辑器,比如 菜鸟教程在线编辑器 (runoob.com)

var="I love you ,Do you love me"
echo $var
> I love you ,Do you love me

var1=${var#*ov}
echo $var1
> e you ,Do you love me

var2=${var##*ov}
echo $var2
> e me

var3=${var%ov*}
echo $var3
> I love you ,Do you l

var4=${var%%ov*}
echo $var4
> I l

var5=${var/ov/OV}
echo $var5
> I lOVe you ,Do you love me

var6=${var//ov/OV}
echo $var6
> I lOVe you ,Do you lOVe me

 1.2 字符串

功能语法说明
计算字符串的长度

方法一:${#string}

方法二:expr length "$string"  

方法二:如果string有空格,必须加双引号
获取子串在字符串中的索引位置expr index $string $substr

如果string,substr有空格,必须加双引号

如果匹配,返回子串中字符第一次出现的位置,如果找不到返回0或1

该表达式是从string中搜索substr中某个字符的位置,这个字符是string中最靠前的字符

匹配子串的长度expr match $string substr如果匹配,返回子串的长度,否则返回0
抽取子串

方法一:${string:pos}

方法二:${string:pos:length}

方法三:${string:(-pos)}

方法四:${string:(-pos):length}

方法五:expr substr "$string" pos length

注:expr 索引从1开始计数

${string:pos} 索引从0开始

方法一:从string的pos开始,直到string的末尾

方法二:从string的pos开始,匹配长度为length

方法三:从右边的pos开始匹配,直到string 的末尾

方法四:从右边的pos开始匹配,匹配长度为length

方法五:从string的pos开始,匹配长度为length

var="I love you ,Do you love me"

echo ${#var}
> 26

echo $(expr length "$var")
> 26

varsub="I love"
echo $(expr index "$var" "$varsub")
> 1
注:index是返回varsub中字符最靠前的位置,如果 varsub="me",返回结果为6,即e的索引位置

echo $(expr match "$var" "$varsub")
> 6

echo ${var:2}
> love you ,Do you love me

echo ${var:2:3}
> lov

echo ${var:(-6)}
> ove me

echo ${var:(-6):3}
> ove

echo $(expr substr "$var" 3 4)
> love

 1.3 命令替换

方法一: `command`  #tab键上方的符号

方法二:$(command)

#获取系统中所有用户
cat /etc/passwd | cut -d ":" -f 1

#遍历用户
for user in `cat /etc/passwd | cut -d ":" -f 1`
do
   echo $user
done

# 或

for user in $(cat /etc/passwd | cut -d ":" -f 1)
do
   echo $user
done

 1.4 有类型变量

declare 和 typeset 两者命令等价 

 取消变量类型:将“-”改为“+”

declare -a array
array=("1" "2" "3")
echo ${array[@]}
> 1 2 3

1.5 bash 数学运算expr

使用expr 命令时,操作符 | > <  * 需要加转义符\

expr 只支持整数运算

1.6 bash 数学运算 bc

  • bc 是bash内建的运算器,支持浮点数计算
  • 内建变量scale可以设置,默认为0 (取小数点后几位)

bc 是一个交互式的命令,可通过下列方式在脚本中实现

echo "23+35" | bc
> 58

echo "scale=4;23/3.5" | bc
> 6.5714

2.函数

2.1 函数定义

 $$ 获取子进程的id

$? 获取当前进程的结果

2.2 函数传参

直接在函数名字后加上参数 ,函数内使用 $1 $2 ... 获取

function test
{
   echo "this param is $1" 
}

test 3
> this param is 3

test xiaoming
> this param is xiaoming

2.3 函数返回值

返回值两种方式:

  •  return,只能返回 0- 255的整数。
  •  echo ,可以返回任何字符串的结果

2.4 全局变量和局部变量

  • 全局变量:不出意外,脚本中的所有变量均为全局变量
  • 局部变量:定义变量时,使用local关键字

2.5 函数库

引入自定义的函数库 : . /path/to/base_function.lib

3.文件查找

3.1 find

在磁盘中遍历搜索

语法格式 : find 【路径】【选项】【操作】

例:

find ./ -name 'aa' # 区分大小写
find ./ -iname 'aa' # 不区分大小写


find ./ -name 'aa' -exec rm -rf {} \; # 对搜索到的文件执行指定的操作, {} 代表搜索到的文件

3.2 locate

  • 文件查找命令,所属软件包mlocate
  • 在数据库文件中搜索,数据库每天会定时更新,手动更新命令 updatedb,实际更新/var/lib/mlocate/mlocate.db,配置文件/etc/updatedb.conf(在文件中配置,配置数据库记录哪些目录下的文件)
  • 默认部分匹配

3.3 whereis

 3.4 which

仅查找二进制可执行文件命令

3.5 总结

4.文本处理grep sed awk 

4.1 grep 和 egrep

语法:

grep [option] [pattern] [file 1,file 2...]

command | grep [option] [pattern]

-c 只输出匹配行的数量,不显示具体内容

-w 匹配整个单词

-x 匹配整行

-l 只列出匹配的文件名,不显示具体匹配行内容

grep不支持正则表达式,egrep支持正则表达式,等价于 grep -E。

4.2 sed

sed 是一个流编辑器,对标准输出或文件逐行处理。

语法格式:

  • stdout | sed [option] "pattern command"
  • sed [option] "pattern command" file

4.2.1 sed 选项

选项含义
-n只打印匹配模式行
-e 直接在命令行进行sed编辑,默认选项
-f编辑动作保存在文件中,指定文件执行
-r 支持扩展正则表达式
-i直接修改文件内容
$ cat sed.txt
I love you
You love me

$ sed "p" sed.txt # 默认会把处理行的信息打印出来
I love you
I love you
You love me
You love me

$ sed -n "p" sed.txt
I love you
You love me

$ sed -n "/I/p" sed.txt
I love you

$  sed -n  -e "/you/p" -e "/me/p"  sed.txt # 多个过滤项
I love you
You love me

$ sed -n  -r "/you|me/p"  sed.txt # 使用正则表达式
I love you
You love me

$  sed -n  "s/love/like/g;p"  sed.txt # 不修改sed.txt
I like you
You like me

4.2.2 pattern

commond

$ for i in {1..100}
> do
> echo "The line is $i" >> test.txt
> done

$ sed -n "20p" test.txt
The line is 20

$ sed -n "10,20p" test.txt
The line is 10
The line is 11
The line is 12
The line is 13
The line is 14
The line is 15
The line is 16
The line is 17
The line is 18
The line is 19
The line is 20

$ sed -n "10,+5p" test.txt
The line is 10
The line is 11
The line is 12
The line is 13
The line is 14
The line is 15

$ sed -n "/10/p" test.txt
The line is 10
The line is 100

$ sed -n "/10/,/20/p" test.txt
The line is 10
The line is 11
The line is 12
The line is 13
The line is 14
The line is 15
The line is 16
The line is 17
The line is 18
The line is 19
The line is 20
The line is 100

$ head test.txt
The line is 1
The line is 2
The line is 3
The line is 4
The line is 5
The line is 6
The line is 7
The line is 8
The line is 9
The line is 10

$ sed -i '1,3d' test.txt //删除
$ head test.txt
The line is 4
The line is 5
The line is 6
The line is 7
The line is 8
The line is 9
The line is 10
The line is 11
The line is 12
The line is 13

$ cat sed.txt
I like you
You like me

$ sed -i  "s/love/like/g"  sed.txt # 直接修改sed.txt,替换所有
I love you
You love me

$ cat sed.txt
I LOVE you
You love me

$ sed -i "s/LOVE/like/ig" sed.txt # 参数匹配时忽略大小写
I like you
You like me

$ sed -n "/I/=" sed.txt
1

$ cat sed.txt
I likeaa you
You likebb me

$ sed -i "s/like../very&/g" sed.txt # .表示一个任意字符,&表示匹配到的字符(反向引用)
I verylikeaa you
You verylikebb me

$ sed -i "s/\(like..\)/not\1/g" sed.txt # \1 也表示匹配到的字符串,表示加()的字符串
I verynotlikeaa you
You verynotlikebb me

$ sed -i "s/.....\(like\)../ \1/g" sed.txt # 可以部分引用匹配到的字符串
I like you
You like me


注意:当匹配模式中存在变量时,使用双引号。或者匹配模式使用单引号,变量也加上单引号。

4.2.3 利用sed查找文件内容

sed -n 查找规则 filename | sed -e 过滤条件 -e 过滤件

4.2.4 利用sed删除文件内容

 sed -i 查找规则 filename

4.2.5 利用sed修改文件内容

  sed -i 查找规则 filename

4.2.6 利用sed追加文件内容

$ echo "num 1" > test

$ sed -i "1a num 2" test  #指定行后追加
$ cat test
num 1
num 2

$ sed -i "1,2a num3" test # 指定范围行内,每行后面追加
$ cat test
num 1
num3
num 2
num3

$ sed -i "/1/a  num 11" test # 匹配行后追加
$ cat test
num 1
num 11
num3
num 2
num3

4.3 awk

awk是一个文本处理工具,通常用于处理数据并声称结果报告。

4.3.1 语法格式

  • awk 'BEGIN{}pattern{commonds}END{}' file_name
  • standart output | awk 'BEGIN{}pattern{commonds}END{}'

4.3.2  内置变量

 

 awk '{print NF}' awk.txt    # 内置变量不需要$符号

 awk 'BEGIN{FS=":"}{print $1}' awk.txt  #指定字段分隔符

awk 'BEGIN{RS=";"}{print $1}' awk.txt  #指定行分隔符

awk 'BEGIN{RS=";";FS=":"}{print $1}' awk.txt 

awk 'BEGIN{RS=";";FS=":";ORS="&";OFS="!"}{print $1,$2}' awk.txt  #ORS OFS为输出显示,OFS为输出字段间隔,print的两个字段中需要有“,”

 4.3.3 awk格式化输出printf

# 以:为分隔符,打印第一个和第二个字段,并且中间有空格,每行换行打印 
$ cat /etc/passwd | awk 'BEGIN{FS=":"}{printf "%s %s\n",$1,$2}' 

#打印出的每个字段占20个字符,左对齐(默认没有“-”为右对齐)
$ cat /etc/passwd | awk 'BEGIN{FS=":"}{printf "%-20s %-20s\n",$1,$2}' 

#打印的数字为浮点型,并保留小数点后三位
$ cat /etc/passwd | awk 'BEGIN{FS=":"}{printf "%0.3f\n",$3}' 

4.3.4 awk模式匹配的两种方法

  • RegExp,正则表达式
  • 关系运算匹配
# 匹配root字符串
$ cat /etc/passwd | awk 'BEGIN{FS=":"}/root/{print $0}'

# 第三个字段小于50
$ cat /etc/passwd | awk 'BEGIN{FS=":"}$3<50{print $0}'

# 第三个字段包含三个数字以上的
$ cat /etc/passwd | awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}'

4.3.5 awk中表达式的用法

$ awk 'BEGIN{num1=20;num2+=num1;print num1,num2}'
20 20

$ awk 'BEGIN{num1=20;num2+=num1;print num1+num2}'
40

# 统计有多少行
$ cat /etc/passwd | awk '/$/{sum++}END{print sum}'

# 统计空白行
$ cat /etc/passwd | awk '/^$/{sum++}END{print sum}'

4.3.6 awk 中条件及循环语句

$ cat /etc/passwd | awk 'BEGIN{FS=":"}{if ($3>30 && $3<100) print $0}'

4.3.7 awk 中的字符串

# 打印每行的字段长度
$ cat /etc/passwd | awk 'BEGIN{FS=":"}{for(i=1;i<=NF;i++) {printf "%3d",length($i)};printf "\n"}'

# 查询 “ea” 在字符串 “I have a dream!” 中的位置
$ awk 'BEGIN{str="I have a dream!";loc=index(str,"ea");print loc }'
$ awk 'BEGIN{str="I have a dream!";loc=match(str,"ea");print loc }'

4.3.8 awk的常用项

$ awk -V

$ awk -v var=1 'BEGIN{print var}'
1

4.3.9 awk的数组

$ cat score
Allen 80 90
Mike  81 89
Jerry 99 92

$ awk 'BEGIN{printf "%-10s%-10s%-10s%-10s\n","NAME","YUWEN","MATH","TOTLA"}{total=$2+$3;printf "%-10s%-10d%-10d%-10d\n",$1,$2,$3,total}' score
NAME      YUWEN     MATH      TOTLA
Allen     80        90        170
Mike      81        89        170
Jerry     99        92        191


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值