这里介绍ubuntu中shell脚本的相关基本知识即正则表达式的用法
1、记录命令历史
我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。
与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个应用:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3)!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令。
2、管道
在处理数据时,需要经过几个步骤才能得到最终的数据,后面的命令需要用到前面命令输出的数据,这里就需要用到管道,管道符为|
用法:
command | command | command
例:last | grep Fri 在last数据中查找含有Fri的行信息
ls -l | less 以less模式来阅读ls中的信息
3、管道命令
cut: 对数据进行分解,截取某一个字段
语法:cut -d “分隔字符” [-cf] n 这里的n是数字
-d :后面跟分隔字符,分隔字符要用双引号括起来
-c :后面接的是第几个字符
-f :后面接的是第几个区块
例:ubuntu@ubuntu:~/Documents$ cat test4.text | cut -d ” ” -f1
sort :用做排序
语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2
-t 分隔符 :作用跟cut的-d一个意思
-n :使用纯数字排序
-r :反向排序
-u :去重复
-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序
wc :统计文档的行数、字符数、词数,常用的选项为:
-l :统计行数
-m :统计字符数
-w :统计词数
uniq :去重复的行
-c :统计重复的行数,并把行数写在前面
-d:仅显示重复的行
-u:仅显示不重复的行
例:ubuntu@ubuntu:~/Documents$ cat test4.text | sort | uniq
删除重复的行,前提是先排序
tee:将数据写入文件
-a: 写到文件尾部;默认从头开始写,会覆盖原有数据
-i: 忽略中断
例:ubuntu@ubuntu:~/Documents$ echo “nihaoa” | tee test1.text -a
tr:删除字符
tr -d “ ” :删除字符
tr -s “ ” “ ”:后面的字符代替前面的字符
例:
ubuntu@ubuntu:~/Documents$ cat test1.text | tr -d “a”
ubuntu@ubuntu:~/Documents$ cat test1.text | tr -s “a” “b”
split:分割文件
-l: 以行数来分
-b :以文件大小来分
例:ubuntu@ubuntu:~/Documents$ split -l 1 test1.text
会自动生成分割后的几个文件
4、多条命令
平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢:
1、command1 ; command2
2、command1 && command2
3、command1 || command2
使用”;”时,不管command1是否执行成功都会执行command2; 使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;使用”||”时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行。也可以用-a 和-o 代替and/or.
5、重定向
输入输出从定向
输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>。
command > file :输出保存到file,覆盖file中原内容 类似tee
command >> file :追加,不覆盖
6、正则表达式RE(regular expression)
正则表达式主要用于搜寻字符串,匹配文件内容和过滤特殊信息等;具有十分强大的功能
在linux中常用的工具有grep, sed, awk
下面介绍几种简单的RE语法:
- ^word :搜索字符在行首 ^[a-w]
- word$ :搜索字符在行尾
- . :任何一个可能的字符
- \ :转义字符,将特殊字符变成普通字符
- ? :任何一个单一字符
- * : 重复匹配,一个或多个任意字符
- [ ] :代表范围或列表 [0-9]
grep:
grep命令是Linux系统中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。
参数:主要作用为设置输出方式
- -c :打印符合要求的行数
- -i :忽略大小写
- -n :在输出符合要求的行的同时连同行号一起输出
- -v :打印不符合要求的行
- -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
- -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
- -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
参数可以不用,直接进行re匹配,输出匹配结果
例:
ubuntu@ubuntu:~/Documents$ grep -n ^”reboot” test2.text
带行号输出以reboot开头的在文件test2.text中的行内容
ubuntu@ubuntu:~/Documents$ grep -n [0-9] test2.text
带行号输出所有包含数字的行
ubuntu@ubuntu:~/Documents$ grep -n .*/6 test2.text
带行号输出具有格式 xxxx/6的行,x代表任意字符,个数不限
sed,awk
grep实现的只是查找功能,不能实现把查找的内容替换掉。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。其内容较为复杂丰富,这里不再详细介绍
7、通配符
通配符是一种特殊语句,主要有* 和?两个符号:
*:一个或多个任意字符
?:一个任意字符
在寻找文件或目录名时,可以通过使用通配符来进行匹配查找相关的文件
例:
ubuntu@ubuntu:~/Documents