shell进阶2
十一. awk编程:
1. 变量:
在awk变量在赋值时即已经完成了定义。
变量的类型可以是数字、字符串。
未初始化变量的值为0或空白字符串" ",
变量的赋值符号列表
= += -=
*= /= %= ^=
awk '$1 ~ /Tom/ {Wage = $2 * $3; print Wage}' filename
awk ' {$5 = 1000 * $3 / $2; print}' filename
十二. 行的排序命令sort:
1. sort命令行选项:
-t 字段之间的分隔符
-f 基于字符排序时忽略大小写
-k 定义排序的域字段,或者是基于域字段的部分数据进行排序
-m 将已排序的输入文件,合并为一个排序后的输出数据流
-n 以整数类型比较字段
-o outfile 将输出写到指定的文件
-r 倒置排序的顺序为由大到小,正常排序为由小到大
-u 只有唯一的记录,丢弃所有具有相同键值的记录
-b 忽略前面的空格
2. sort使用实例:
sort -t':' -k 1 users
-t定义了冒号为域字段之间的分隔符,-k 2指定基于第二个字段正向排序(字段顺序从1开始)。
sort -t':' -k 3r users
还是以冒号为分隔符,这次是基于第三个域字段进行倒置排序。
sort -t':' -k 6.2,6.4 -k 1r users
先以第六个域的第2个字符到第4个字符进行正向排序,在基于第一个域进行反向排序。
sort -t':' -k 6.2,6.4 -k 1 users
先以第六个域的第2个字符到第4个字符进行正向排序,在基于第一个域进行正向排序。
和上一个例子比,第4和第5行交换了位置。
sort -t':' -k 1.2,1.2 users
基于第一个域的第2个字符排序
sort -t':' -k 6.2,6.4 -u users
基于第六个域的第2个字符到第4个字符进行正向排序,-u命令要求在排序时删除键值重复的行
sort -t':' -k 3 users2
基于第3个域字段以文本的形式排序
sort -t':' -k 3n users2
基于第3个域字段以数字的形式排序
ps -ef | sort -k 1 -o result
基于当前系统执行进程的owner名排序,并将排序的结果写入到result文件中
十三. 删除重复行的命令uniq:
uniq常用的选项如下
-c 可在每个输出行之前加上该行重复的次数
-d 仅显示重复的行
-u 显示为重复的行
sort testfile | uniq -c
|uniq -dc
uniq -uc
十四. 文件压缩解压命令tar:
-c 建立压缩档案
-x 解压
--delete 从压缩包中删除已有文件,如果该文件在包中出现多次,该操作其将全部删除。
-t 查看压缩包中的文件列表
-r 向压缩归档文件末尾追加文件
-u 更新原压缩包中的文件
-z 压缩为gzip格式,或以gzip格式解压
-j 压缩为bzip2格式,或以bzip2格式解压
-v 显示压缩或解压的过程,该选项一般不适于后台操作
-f 使用档案名字,这个参数是最后一个参数,后面只能接档案名。
tar -cvf test.tar *
tar -rvf test.tar *.log
tar -tvf test.tar
tar -uvf test.tar *.log
tar --delete install.log -f test.tar #从压缩包中删除install.log
tar -cvzf test.tar.gz *
tar -tzvf test.tar.gz
tar -jcvf test.tar.bz2 *
十五. 大文件拆分命令split:
-l 指定行数,每多少分隔成一个文件,缺省值为1000行。
-b 指定字节数,支持的单位为:k和m
-C 与-b参数类似,但切割时尽量维持每行的完整性
-d 生成文件的后缀为数字,如果不指定该选项,缺省为字母
split -d -b 5k test.tar.bz2 #-d选项以后缀为数字的形式命名拆分后的小文件
split -l 300 install.log #每300行拆分成一个小文件
十六. 文件查找命令find:
1. 按文件名查找:
-name: 查找时文件名大小写敏感。
-iname: 查找时文件名大小写不敏感。
find . -name "*.log"
2. 按文件时间属性查找:
-atime -n[+n]: 找出文件 访问时间 在n日之内[之外]的文件。
-ctime -n[+n]: 找出文件 更改时间 在n日之内[之外]的文件。
-mtime -n[+n]: 找出 修改数据时间 在n日之内[之外]的文件。
-amin -n[+n]: 找出文件 访问时间 在n分钟之内[之外]的文件。
-cmin -n[+n]: 找出文件 更改时间 在n分钟之内[之外]的文件。
-mmin -n[+n]: 找出 修改数据时间 在n分钟之内[之外]的文件。
find -ctime -2 #找出距此时2天之内创建的文件
find -ctime +2 #找出距此时2天之前创建的文件
find . -cmin -3 #找出修改状态时间在3分钟之内的文件。
3. 基于找到的文件执行指定的操作:
-exec: 对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \ ;
注意{}和\;之间的空格,同时两个{}之间没有空格
-ok: 其主要功能和语法格式与-exec完全相同,每次执行shell命令之前均予以提示,
只有在回答为y的时候,其后的shell命令才会被继续执行。
需要说明的是,该选项不适用于自动化脚本,因为该提供可能会挂起整个自动化流程。
find . -ctime -2 -exec ls -l {} \;
找出距此时2天之内创建的文件,同时基于find的结果,应用-exec之后的命令,即ls -l,
从而可以直接显示出find找到文件的明显列表。
find . -name "*.log" -mtime -1 -exec rm -f {} \;
find . -name "*.dat" -mtime -1 -ok rm -f {} \;
4. 按文件所属的owner和group查找
find . -user root #搜索owner是root的文件
find . ! -user root #搜索owner不是root的文件,注意!和-user之间要有空格。
find . -group root #搜索所属组是root的文件
find . ! -group root #搜索所属组不是root的文件,注意!和-user之间要有空格。
5. 按指定目录深度查找:
-maxdepth: 后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。
find . -maxdepth 1 -name "*"
find . -maxdepth 2 -name "*"
6. 排除指定子目录查找:
-path pathname -prune: 避开指定子目录pathname查找。
-path expression -prune: 避开表达中指定的一组pathname查找。
需要说明的是,如果同时使用-depth选项,那么-prune将被find命令忽略。
find . -path "./DontSearchPath" -prune -o -name "datafile*" -print
当前目录下,避开DontSearchPath子目录,搜索所有文件名为datafile*的文件。
find . \( -path "./DontSearchPath" -o -path "./DoSearchPath" \) -prune -o -name "datafile*" -print
当前目录下,同时避开DontSearchPath和DoSearchPath两个子目录,搜索所有文件名为datafile*的文件
7. 按文件权限属性查找:
-perm mode: 文件权限正好符合mode(mode为文件权限的八进制表示)。
-perm +mode: 文件权限部分符合mode。如命令参数为644(-rw-r--r--),那么只要文件权限属性中有任何权限和644重叠,这样的文件均可以被选出。
-perm -mode: 文件权限完全符合mode。如命令参数为644(-rw-r--r--),当644中指定的权限已经被当前文件完全拥有,同时该文件还拥有额外的权限属性,这样的文件可被选出。
find . -perm 644 #查找所有文件权限正好为644(-rw-r--r--)的文件。
find . -perm -444 #644所包含的权限完全覆盖444所表示的权限
8. 按文件类型查找:
-type:后面指定文件的类型。
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
9. 按文件大小查找:
-size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
-empty: 查找空文件。
find . -size +4k -exec ls -l {} \; #查找文件大小大于4k的文件,同时打印出找到文件的明细
find . -size -4k -exec ls -l {} \; #查找文件大小小于4k的文件
find . -size 183c -exec ls -l {} \; #查找文件大小等于183字节的文件。
find . -empty -type f -exec ls -l {} \;
10. 按更改时间比指定文件新或比文件旧的方式查找
-newer file1 ! file2: 查找文件的更改日期比file1新,但是比file2老的文件。
ls -lrt
find . -newer users
find . ! -newer users2 #查找文件更改日期不比users1新的文件
find . -newer users2 ! -newer test.tar.bz2
十七. xargs命令:
find命令将所有匹配到的文件传递给exec,有些系统对能够传递给exec的命令长度有限制
xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
/> find . -type f -print | xargs file
#查找当前目录下的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件。
/> find . -type f -print | xargs chmod a-x
#回收当前目录下所有普通文件的执行权限。
/> find . -type f -print | xargs grep "hostname"
#在当面目录下查找所有普通文件,并用grep命令在搜索到的文件中查找hostname这个词
/> find / -name "core" -print | xargs echo "" >/tmp/core.log
#在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中。
/> pgrep mysql | xargs kill -9 #直接杀掉mysql的进程
十八. 和系统运行状况相关的Shell命令:
1. Linux的实时监测命令(watch):
watch -d -n 1 'who' #每隔一秒执行一次who命令,以监视服务器当前用户登录的状况
-d表示高亮发生变化的位置
-n表示间隔多少秒执行一次"command"
watch可以同时运行多个命令,命令间用分号分隔
watch -d -n 1 'df -h; ls -l'
监控磁盘的使用状况,以及当前目录下文件的变化状况,包括文件的新增、删除和文件修改日期的更新等。
2. 查看当前系统内存使用状况(free):
常用选项
-b 以字节为单位显示数据。
-k 以千字节(KB)为单位显示数据(缺省值)。
-m 以兆(MB)为单位显示数据。
-s delay 该选项将使free持续不断的刷新,每次刷新之间的间隔为delay指定的秒数,
如果含有小数点,将精确到毫秒,如0.5为500毫秒,1为一秒。
free命令输出包含以下几列:
total 总计物理内存的大小。
used 已使用的内存数量。
free 可用的内存数量。
Shared 多个进程共享的内存总额。
Buffers/cached 磁盘缓存的大小。
free -k -s 1.5 #以千字节(KB)为单位显示数据,同时每隔1.5刷新输出一次,直到按CTRL+C退出
3. CPU的实时监控工具(mpstat):
mpstat 2 5
该命令将每隔2秒输出一次CPU的当前运行状况信息,一共输出5次,
如果没有第二个数字参数,mpstat将每隔两秒执行一次,直到按CTRL+C退出。