Linux三剑客
管道
shell 输入域输出
在介绍管道时,先来介绍shell的输入与输出
read:用来读取输入,并赋值给变量,他的用法也很简单,就是 read x
后面跟一个变量,回车后系统会等到你输入值,再回车就可以把值存储到变量里。用
echo $x
就能打印出存入变量了的数据。
echo , printf:可以简单输出变量
read xkkkjk➜ ~ echo $xkkkjk➜ ~ printf $xkkkjk#
> file
:将输出重定向到另外一个文件。例如:echo 123 > 4.txt
这个语句的意思是将echo输出的内容写到一个文件里,这里的 >
就起到这样一个作用。但是他会覆盖文件里原有的内容如果要在一个文件里追加内容就可以用 >>
,这样就不会覆盖原来的内容。< file
表示输入重定向。
文件描述符
一个程序有输入有输出也会有错误
在Linux里面,为了表示这三种状态用三个不同的标记符来表示。
- 标准输入0——输入文件
- 标准输出1——输出文件
- 标准错误2——错误输出文件
例如:打开一个不存在的文件,这就是一个错误输出2,正常打开一个文件就是正常输出1, read x
从外界读取一个内容时就是正常输入0.
管道
管道的作用是吧不同程序的输入和输出连接,在Linux中是 |
由图可以看出上一个程序的输出是下一个程序的输入。
例如:cat <文件> | less
, cat打印出的内容传递给了less。
在管道里遇到的坑
echo 12345 | read x
运行完之后, echo $x
你会发现输出的内容是空的。
原因是管道会独立开启一个进程,echo
与 read
不在一个进程里的。你在新的进程里面创建的变量,进程执行完,变量也会随之消失。
解决方案:echo 12345 | while read x;do echo $x;done
这样就行了。
- grep 数据的查找定位
- awk 数据切片
- 数据修改
grep
- 全称:Global Regular Expression and Print out the line
- 基于正则表达式查找满足条件的行
用法
grep pattern file:pattern意思是给定一个正则,file是一个文件,如果没有文件他会读取你的标准输入。举一个简单的例子:
[root@123456 ~]# grep 5 #输入并回车
1 2 3
4 5 6 #输入内容
4 5 6 #输出内容
当grep发现发现有5的那一行,他就会打印出来
而利用管道就简单了
[root@123456 ~]# echo '1 2 3
4 5 6
7 8 9' | grep 5
4 5 6
查找文件内容
grep x 1.txt
从文件中查找匹配的行
参数介绍:
- grep -i pattern file:忽略大小写
- grep -v pattern file:不显示匹配的行
- grep -o pattern file:把每个匹配的内容用独立的行显示
- grep -E pattern file:使用扩展正则表达式
- grep -A -B -C pattern
file:打印命中数据的上下文,-Ax打印匹配的下x行,-Bx打印匹配到的上x行,-Cx打印匹配到的上下x行。
- grep pattern -r dir/:递归搜索,遍历指定目录下的所有文件的内容
awk
- 名字是三个作者的简写
- 根据定位到的数据行处理器中的字段
- awk是Linux下的一个命令,同时也是一种语言解析引擎
- awk具备完整的编程特性。比如执行命令、网络请求等
语法 awk 'pattern{action}'
awk理论上可以代替grep,简单用法:
[root@123456 ~]$echo '123xxxx123456' | awk '/xxx/'
123xxxx123456
- awk 'BEGIN{}END{}'开始和结束的时候执行一次操作
- awk '/Running/' 表示正则匹配
- awk '/aa/,/bb/' 表示区间的匹配。以aa开头的匹配和bb结束时的匹配
awk内置变量
FS:字段分隔符echo '1 2 3' | awk -F ' ' '{print $1}'
OFS:输出数据的字段分隔符echo '1 2 3' | awk -F ' ' '{OFS="-"}{print $1,$2,$3}'
将分隔符改成指定的
RS:记录分隔符
ORS:输出字段的行分隔符,每一行加一个分隔符
NF:字段数,通常表示最后一个字段echo '1 2 3' | awk -F ' ' '{print $(NF-1)}'
NF是最后一个,NF-1相当于$2输出的就是2
NR:记录数,默认的一行为一个记录数。用法 awk 'NR>1' test.txt
作用是输出大于一行的内容
sed
- stream editor
- 根据定位到的数据进行修改数据
他的格式为:sed [addr]X[options]
- addr:是一个定位表达式
- X:表示一个动作,是打印还是
- options:追加具体的参数
- 例如:sed -n '2p'
打印第二行,d删除、p打印通常结合-n参数
- 用的比较多的就是 sed 's#hello#world#'
对字符串进行修改。s表示search表示查找替换的意思,#可以用其他的符号进行替换。表达式的最后跟一个g,表示全局替换。
- -e 表示匹配多个表达式
- -i直接修改原文件
- -E扩展表达式
- --debug 调试
正则表达式
基本表达式(BRE)
^ 表示以某个内容开头,$ 表示以某个内容结尾
[root@123456 ~]$echo 1234 | grep ^1
1234
[root@123456 ~]$echo 1234 | grep 4$
1234
[a-z],[0-9] 表示一个区间,也可以是任意的字符 [456]
[root@123456 ~]$echo '123
> abc
> 12a' | grep [0-9]
123
12a
- 表示0个或多个星号前面的字符
[root@123456 ~]$echo '12333
> abc3
> 12a' | grep -o 3*
333
3
. 表示任意字符
[root@123456 ~]$echo '12333
> abc3
> 12a' | grep -o a.
ab
扩展正则表达式(ERE)
- ?表示非贪婪匹配
- + 一个或多个
- ()分组
- {} 范围约束
- | 匹配多个表达式的任何一个
来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力
QQ交流群:484590337
公众号 TestingStudio
点击获取更多信息