shell常用工具

来源:互联网 发布:js定时执行函数 编辑:程序博客网 时间:2024/06/05 09:48


脚本的调试

  • -n 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误

  • -v 一边读脚本,一边把执行过的脚本命令打印到标准错误输出

  • -x 可以在程序中设置调试某一段

  • grep 基本正则(+E可成扩展正则)

  • egrep 扩展正则

shell编程常用工具:
  • grep 根据文件内容无过滤
  • find 根据文件名\文件类型
  • awk 列处理工具
  • sed 行处理工具
  • xargs 将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

find

不会打开文件里面的内容

    1. 命令的形式:
find 路劲名 -option[-print -exec -ok...]
    1. 参数
    • pathname:查找的目录路径(/表示系统根目录,递归查找)
    • -print:将匹配的文件输出到标准输出
    • -exec: 对匹配的文件执行参数所给出的shell命令
    • -ok: 和-exec作用相同,模式安全

例如:

1.
  • 找到当前目录下的所有普通文件,并将他们全部列出
find . -type f -exec ls -l {} \;
  • 在/logs目录中查找更改时间在5日天以前的文件并删除
$ find logs -type f -mtime +5 -exec rm {} \;
2.用perm选项

按照文件权限模式用perm选项,按文件权限模式来查找文件(八进制)

find . -perm 755 -print
3.忽略某个目录

使用-prune,如果同时使用了-depth选项,那么-prune就会被find忽略

4. -nouser

查找主账户已经被删除的文件,使用-nouser.

  • 在home目录下查找所有的这类文件:
find /home -nouser -print

xargs

将前一个命令的输出传递给下一个命令,作为参数,默认命令echo

只有一个进程,每次只获取一部分文件。

xargs与管道|的区别

| 用来将前一个命令的标准输出传递到下一个命令的标准输入。

xargs 将前一个命令的标准输出传递给下一个命令,作为它的参数。

xargs与exec的区别
  • exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次将参数传给命令,可以使用-n控制参数个数
  • exec文件名有空格等特殊字符也能处理;xargs不能处理特殊文件名,如果想处理特殊文件名需要特殊处理

exec的缺点是

  • 每处理一个文件/目录,都要启动一次命令,效率不好;
  • 格式麻烦,必须用{}做文件的代位符,必须用 ;
  • 作为命令的结束符,书写不便。
  • 而xargs不能操作文件名有空格的文件。所以如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的、 文件数目也不大,那么使用 xargs比较方便; 否则,就要用 exec了。

sed

行处理工具

  • 流编译器。
  • 把待处理文件的内容连同处理结果一起输出

常用命令:

/pattern/p 打印匹配pattern的行/pattern/d 删除匹配pattern的行/pattern/s/pattern1/pattern2/  查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2/pattern/s/pattern1/pattern2/g  查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2

打印其中包含abc的行:

python@ubuntu:~/1004$ vi t10.shpython@ubuntu:~/1004$ sed '/456/p' t10.sh123abc456456

删除:

python@ubuntu:~/1004$ sed /abc/d t10.sh123456

删除第二行第三行:

python@ubuntu:~/1004$ sed '2,3d'除 t10.sh123

匹配标签:

sed 's/<[^>]*>/ /g' t11.sh

awk 列处理工具

  • $0 代表行
  • $1,$2...列

打印第二列:

python@ubuntu:~/1004$ awk '{print $2;}' t12.sh102030

打印第二列大于10的:

python@ubuntu:~/1004$ awk '$2>10 {printf "%s\t%s\n", $0, "aaa"}' t12.shp2 20aaap3 30aaa

打印一共有多少行空格:

python@ubuntu:~/1004$ awk '/^ *$/ {x=x+1;} END {print x}' t12.sh5

打印系统中的用户账号列表:

awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd