##简介
shell编程中的读取,函数,正则表达式,文本处理工具的简单使用
read
read:读取控制台的输入
参数:
- -p:指定读取时的提示符
- -t:等待读取的时间
脚本例子
编写i.sh脚本,enter your name:提示用户在控制台输入,如果5秒未输入自动执行退出
bash
#!/bin/bash
read -t 5 -p "enter your name:" name
echo "hello,$name"
. i.sh
运行脚本
函数
分为系统函数和自定义函数
系统函数
系统自带的一些,但是感觉使用起来和命令差不多
basename
basename:截取文件名
可带参数 suffix:后缀,会去掉文件名的后缀
bash
basename /tmp/a.txt .txt
dirname
dirname:获得文件的路径,不包括文件名
bash
dirname /tmp/a.txt
自定义函数
语法
方法名()
{
方法体
}
在脚本中编写方法:
bash
#! /bin/bash
function add(){
s=$[ $1 + $2 ]
echo $s
}
read -p "enter first numnber: " a
read -p "enter second number: " b
add $a $b
这个脚本就是提示用户输入a,b两个参数
add $a $b调用方法,传入a,b变量
运行结果:
正则表达式
对自己想要的字符或者文本做模糊式的匹配搜索,就使用正则表达式写一个匹配的规则。
linux中很多的文本工具都是支持正则表达式的,比如grep。
常用的匹配字符
^
^可以匹配以指定字符开头的行
bash
cat a.txt | grep ^j
可以查询a.txt文本中的以j开头的行
$
$可以匹配以指定字符结尾的行
bash
cat a.txt | grep oo$
可以查询a.txt文本中的以oo结尾的行
.
.:可以匹配一个任意字符
bash
cat a.txt | grep h...o
可以查询包含h开头,o结尾的5个字符的字符串的行,h和o之间的3个字符任意
*
*:不是单独使用的,是前一个字符出现0次或者多次,即h *e表示可以匹配到e,he,hhe
bash
cat a.txt | grep hel*o
可以和.结合使用,.*表示任意字符任意长度
[ ]
[]:字符区间,表示匹配某个范围内的字符
常用的方式有
- [0,9]:匹配0或者9
- [0-9]:匹配0-9中的一个字符
- [0-90]*:匹配任意长度的0-9中的字符,即任意数字
- [a-z]:匹配任意字母字符
\
\:转义符,对于一些特殊的符号,要使用转义符
bash
cat a.txt | grep '\$'
需要使用''单引号
扩展
一些扩展是不支持的,需要-E参数
刷选手机号:
匹配规则是1开头,0-9数字出现10次的字符
{}里面可以添加数字,但需要加-E参数来支持
需要有$来限制
文本处理工具
cut
可以从文件中的每一行去进行分割,选择输出想要的内容
参数:
- -f:选择第几列
- -d:分割符
- -c:按字符进行分割
例子
有一个a.txt文本
使用cut
bash
cat a.txt | cut -d " " -f 2
输出:
解析 :
-d " " 表示以空格分割,a.txt中则会被分割成两列
-f 2 表示选择第二列
如果想选择多个列,可以,隔开, -f 2,3,4
如果想选择2列到4列的内容,可以使用 -f 2-4
如果想选择2列之后的全部,可以使用 -f 2-
awk
和cut类似,只是功能更加的强大,默认以空格分开,可以对选择的部分做处理。
参数:
- -F:分隔符
- -v:可以引入一个变量
例子
有一个a.txt文本
使用awk
bash
cat a.txt | awk '/^hello/ {print $2","$1}'
输出结果:
解析:
'/^hello/ {print $2","$1}':它是分成两部分的,第一部分是/^hello/,是一个正则表达式,可以帅选想要的内容,可以省略的。第二部分是{print $2","$1},print是输出,","是输出选择的两列内容中间以什么分割。这两部分要写在' '单引号中,因为awk是默认空格分割的,所以没有指定分割符了,不然可以使用-F指定分割符。
添加字符串
可以在开头和结尾添加字符串,使用BEGIN{print "内容"}和END{print "内容"}
bash
cat a.txt | awk 'BEGIN{print "begin"} /^hello/ {print $2","$1} END{print "end"}'
运行结果:
可以对列加减
准备一个a.txt,第三列是数字
bash
cat a.txt | awk '{print $3 + 1}'
运行结果:
使用自定义变量
bash
cat a.txt | awk -v i=1 '{print $3 + i}'
使用-v参数可以引入自定义变量,传递给''部分
内置变量
awk中默认自带的变量
- FILENAME:文件名
- NR:已读行号
- NF:列数
查询文件中的空行行号:
准备一个a.txt文件
awk '/^$/ {print NR}' a.txt
运行结果: