linux的学习(七):读取,函数,正则表达式,文本处理工具cut和awk

##简介

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 '\$' ``` 需要使用''单引号 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0047e0b6c27f488684fc66effea859ff.png) ##### 扩展 一些扩展是不支持的,需要-E参数 刷选手机号: 匹配规则是1开头,0-9数字出现10次的字符 {}里面可以添加数字,但需要加-E参数来支持 需要有$来限制 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5130e79587c449f3a29fb88535f439f0.png) ### 文本处理工具 #### cut 可以从文件中的每一行去进行分割,选择输出想要的内容 参数: * -f:选择第几列 * -d:分割符 * -c:按字符进行分割 ##### 例子 有一个a.txt文本 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b76dd719610044bda4909304c65070c8.png) 使用cut ```bash cat a.txt | cut -d " " -f 2 ``` 输出: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2c712434386d4d7daea4c39942ee306e.png) **解析** : -d " " 表示以空格分割,a.txt中则会被分割成两列 -f 2 表示选择第二列 如果想选择多个列,可以,隔开, -f 2,3,4 如果想选择2列到4列的内容,可以使用 -f 2-4 如果想选择2列之后的全部,可以使用 -f 2- #### awk 和cut类似,只是功能更加的强大,默认以空格分开,可以对选择的部分做处理。 参数: * -F:分隔符 * -v:可以引入一个变量 ##### 例子 有一个a.txt文本 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b76dd719610044bda4909304c65070c8.png) 使用awk ```bash cat a.txt | awk '/^hello/ {print $2","$1}' ``` 输出结果: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e15e57c4d4024f8cbf176308e1b7cdfc.png) **解析:** '/\^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"}' ``` 运行结果: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d5322d76c36640d08d93c76da7447298.png) ##### 可以对列加减 准备一个a.txt,第三列是数字 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c9213bc693ee4896a14666bd3e485776.png) ```bash cat a.txt | awk '{print $3 + 1}' ``` 运行结果: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2db76fbc39784ddd9c60f62faa0f682f.png) ##### 使用自定义变量 ```bash cat a.txt | awk -v i=1 '{print $3 + i}' ``` 使用-v参数可以引入自定义变量,传递给''部分 ##### 内置变量 awk中默认自带的变量 * FILENAME:文件名 * NR:已读行号 * NF:列数 查询文件中的空行行号: 准备一个a.txt文件 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dfd7303b1eee4e8787edef710f890263.png) `awk '/^$/ {print NR}' a.txt` 运行结果: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f3392af268f94aed82a7e0ee27a1c715.png)

相关推荐
令狐前生4 分钟前
设计模式学习整理
学习·设计模式
湘-枫叶情缘33 分钟前
解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证
科技·学习·重构·生活·学习方法
欧先生^_^2 小时前
Linux内核可配置的参数
linux·服务器·数据库
inputA2 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
海尔辛2 小时前
学习黑客5 分钟读懂Linux Permissions 101
linux·学习·安全
王RuaRua3 小时前
[数据结构]5. 栈-Stack
linux·数据结构·数据库·链表
曼岛_3 小时前
[架构之美]linux常见故障问题解决方案(十九)
linux·运维·架构
真的想上岸啊3 小时前
学习51单片机01(安装开发环境)
嵌入式硬件·学习·51单片机
tan180°3 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
大神的风范4 小时前
从0开始学linux韦东山教程第三章问题小结(4)
linux·服务器