1.文本处理工具
1.1 grep工具
Linux grep 命令用于查找文件里符合条件的字符串。 grep [选项] '关键字 文件名
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep "thermcontact" /.in
从文件内容查找与正则表达式匹配的行:
$ grep –e "正则表达式" 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:
$ find / -type f -name "*.log" | xargs grep "ERROR"
例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
find . -name "*.in" | xargs grep "thermcontact"
1.2 cut工具
cut 是列截取工具,用于列的截取。 cut 选项 文件名
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
参数:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
cut 的使用:
1.3 sort工具
Linux sort命令用于将文本文件内容加以排序。
sort可针对文本文件的内容,以行为单位来排序。
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
1.4 uniq工具
Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。(去除连续的重复行)
uniq 可检查文本文件中重复出现的行列。
举例如下:
1.5 tee工具
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
-a或--append 附加到既有文件的后面,而非覆盖它
实例:
使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令:
$ tee file1 file2 #在两个文件中复制内容
将内容追加在文件后
echo hello world | tee -a 文件名
1.6 diff工具
Linux diff命令用于比较文件的差异。
diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
1.6 paste工具
Linux paste 命令用于合并文件的列。
paste 指令会把每个文件以列对列的方式,一列列地加以合并。
1.7 tr工具
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备
2.基本特性
2.1 常见的快捷键
2.2 常见的通配符
shell常见的通配符,注意与正则稍有不同:
字符 | 含义 | 实例 |
* | 匹配0个或多个任意字符 | a*b,a与b之间可以有任意长度的字符,也可以没有。 例如:aabcb,ab,azxcb... |
? | 匹配一个任意字符 | a?b,a与b之间必须但也只能存在一个字符,该字符可以是任意字符。 例如:aab,abb,acb... |
[list] | 匹配list中的任意单个字符 | a[xyz]b,a与b之间必须但也只能存在一个字符,该字符只能是x或y或z。 例如:axb,ayb,azb |
[!list] | 匹配除list中的任意单个字符 | a[!a-z]b,a与b之间必须但也只能存在一个字符,该字符不能是小写字母。 例如:aAb,a0b... |
[c1-c2] | 匹配c1-c2间的任意单个字符 | a[0-1]b,a与b之间必须但也只能存在一个字符,该字符只能是数字。 例如:a0b,a1b... |
{string1,string2,...} | 匹配string1、string2等中的一个字符串 | a{abc,xyz,opq}b,a与b之间必须但也只能存在一个字符串,字符串只能是abc或xyz或opq。 例如:aabcb,axyzb,aopqb... |
实例:
[root@youxi1 ~]# ls /etc/*.conf
/etc/asound.conf /etc/kdump.conf /etc/man_db.conf /etc/sudo-ldap.conf
/etc/chrony.conf /etc/krb5.conf /etc/mke2fs.conf /etc/sysctl.conf
/etc/dracut.conf /etc/ld.so.conf /etc/nsswitch.conf /etc/vconsole.conf
/etc/e2fsck.conf /etc/libaudit.conf /etc/resolv.conf /etc/yum.conf
/etc/fuse.conf /etc/libuser.conf /etc/rsyslog.conf
/etc/GeoIP.conf /etc/locale.conf /etc/sestatus.conf
/etc/host.conf /etc/logrotate.conf /etc/sudo.conf
[root@youxi1 ~]# ls /etc/???.conf
/etc/yum.conf
[root@youxi1 ~]# touch file{1,2,3}
[root@youxi1 ~]# ls file*
file1 file2 file3
[root@youxi1 ~]# ls file[123]
file1 file2 file3
2.3 常见的通配符
Linux Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)。
- 双引号(" "):在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身。
- 单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。
- 反引号(` `):在反引号中的字符串将解释成shell命令来执行。
-
举例: root@gyb-ubuntu:~# echo "$PATH" /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 可以看到在双引号中,$被作为特殊字符处理,PATH被解释为变量。 root@gyb-ubuntu:~# echo '$PATH' $PATH 在单引号中,特殊字符也失去了特殊意义作为普通字符输出。 root@gyb-ubuntu:~# echo ls ls ls是一个shell命令,直接echo ls shell会将ls作为普通字符输出。如果我们加上反引号就不一样了, root@gyb-ubuntu:~# echo `ls` 99.sh cloud_curr_design cloud_curr_design.tar.gz exefile for.sh gyb_virsh httpd-2.2.31 qemu_help readfile.sh switch.sh temp temp10.sh temp1.sh temp2.sh temp3.sh temp4.sh temp5.sh temp6.sh temp7.sh temp8.sh temp9.sh te.sh test9.sh ubuntu1204Server.img ubuntu1204Server.xml ubuntuGuest.xml ubuntu-server.img win7.img 加上反引号之后,shell将ls作为命令执行,并将结果返回。
3.shell编程模块
(1)什么时候用到脚本?
重复化、复杂化的工作,通过把工作命令写成脚本,以后仅仅需要执行脚本文件就能完成这些工作。
(2)shell能干什么?
1.自动化的部署软件 (tomcat)
2.自动化的管理 (系统初始化脚本、批量更改主机密码、推送公钥)
3.自动化分析处理 (统计网站访问量)
4.自动化备份 (数据库备份、日志转储)
5.自动化监控脚本
3.1 shell脚本基本写法
(1)脚本第一行,需#!指定解释器 ( #!/bin/bash 表示以下内容使用bash解释器解析 【必写】)
注意:
如果直接将解释器路径写死在脚本中,可能在某些系统上找不到解释器的兼容性问题,所以可 #!/bin/env 解释器 ( #!/bin/env bash )
(2)变量的定义
规则:变量名区分大小写、变量名不能有特殊符号、变量名不能已数字开头、等号两边不能有任何空格。
交互式的定义变量:Linux read命令用于从标准输入读取数值。
定义有类型的变量(Declare)
变量的分类:
环境变量:当前进程有效,并且能够被子进程调用。
env 查看当前用户的环境变量
set 查看当前用户的所有变量(环境变量和临时变量)
export 变量名=变量值 。
全局变量:
(3)四则运算
在linux shell中,我们可以使用 $(()) 将表达式放在括号中,即可达到运算的功能。
[wang@centos5 ~]$ b=$((5*5+5-3/2))
[wang@centos5 ~]$ echo $b
29
expr 实现运算:
[wang@centos5 ~]$ expr 5 - 4
1
注意:将需要运算的表达式写入在expr 后面即可,保证 参数与运算符号中间有空格隔开。
let 命令实现运算:
let 后跟的是双引号括起来的表达式。表达式中的变量不需要加$符号。
let "x = x + (y / 2)" <==> (( x= x+ (y / 2) ))
-
$ echo $x
-
26
-
$ let "x += 2"
-
$ echo $x
-
29
与双括号方式相比,let命令没有返回结果。赋值操作在表达式内部完成。
Shell中常用指令
linux中$#的使用
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
Shell 输入/输出重定向:
Shell 中的表达式:
文件表达式
-e filename 如果 filename存在,则为真 文件存在(existence)
-d filename 如果 filename为目录,则为真 文件存在并是一个目录(directory)
-f filename 如果 filename为常规文件,则为真 文件存在并且是一个常规的文件(file)
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
整数变量表达式
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
字符串变量表达式
If [ $a = $b ] 如果string1等于string2,则为真
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2,则为真
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空,则为真
if [ $sting ] 如果string 非空,返回0 (和-n类似)
逻辑非 ! 条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ] 如果不存在目录$num
逻辑与 –a 或者&& 条件表达式的并列
if [ 表达式1 –a 表达式2 ]
逻辑或 -o 或者|| 条件表达式的或
if [ 表达式1 –o 表达式2 ]
if [ condition1 ]; then
command1
elif [ condition2 ]; then
command2
else
commandN
fi
shell循环:
(1)while read 的使用
while read line
do
…
done < file
read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。
(2)for循环使用
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
输出结果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
顺序输出字符串中的字符:
for str in 'This is a string'
do
echo $str
done
输出结果:
This is a string
[ ]在判断空字符串的时候需要加" "
[[ ]]在判断空字符串的时候不加" "也可以
用逻辑运算符&&或者|| 连接两个表达式的时候,一个[ ]不可以,但是[[ ]]就可以
单引号'',双引号""的区别是单引号''剥夺了所有字符的特殊含义,单引号''内就变成了单纯的字符。双引号""则对于双引号""内的参数替换($)和命令替换(``)是个例外。
比如说 n=3
echo '$n'
结果就是$n
改成双引号 echo "$n",结果就是3
反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command`,指执行的终端指令。
$( )与` `(反引号)都是用来作命令替换的。
$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
参考网站:https://www.cnblogs.com/chengd/p/7803664.html (很详细)