zoukankan      html  css  js  c++  java
  • Linux Shell Scripting Cookbook 读书笔记 2

    cat,script,find, xargs, tr, tmp文件,字符串截取,批量文件重命名,固定大小文件,自动化交互

    1. cat的用法

    压缩连续的空白行

    cat -s file

    也可以用tr,将连续' ',压缩成一个' '

    cat file | tr -s ' '

    显示制表符

    cat -T file

    显示行号

    cat -n file

    2. script命令

    录制: script -t 2> time.log out.session

    type commands;

    exit退出录制

    回放: scriptreplay time.log out.session

    记录日志: script -aq out -c "pwd"

    可以将-c里面执行命令的结果保存到out文件,达到记录日志的目的

    3. find命令

    多条件组合

    注意括号需要转义,后面必须有空格

    查找shell还有python文件

    目录深度

    find . -mindepth 2 -type f

    find . -maxdepth 1 -type d

    文件类型

    find . -type d  # d表示目录,f表示文件,l表示链接

    文件时间,linux中没有文件创建时间概念

    -atime,用户最近一次访问文件的时间; -mtime,文件内容最后一次被修改的时间; -ctime,文件元数据(metadata,例如权限或所有权)最后一次改变的时间

    其中-表示小于,+表示大于

    查找七天内被访问过的文件: find . -type f -atime -7; 恰好在七天前被访问的文件: find . -type f -atime 7; 超过七天被访问的文件: find -type f -atime +7

    相似的有amin,mmin,cmin,以分钟为单位

    文件大小

    -size ( b,块 512字节; c,字节; w,字 2字节; k, 千字节; M,兆字节; G )

    其中-表示小于,+表示大于

    删除文件 -delete

    删除当前目录下所有.swp文件: find . -type f -name "*.swp" -delete

    所有权或用户查找

    find . -type f -perm 644

    find . -type f -user sryan

    结合find执行命令,-exec

    将当前目录下用户为root的文件改为sryan

    find . -type f -user root -exec chown sryan {} ;

    {}是find搜寻的结果,转义分号,不让shell解释,意思该分号是给-exec使用

    -exec只能接受单个命令,所以如果有多个命令,可以写成脚本,-exec ./comand.sh {} ;

    find命令全部输出只是一个单数据流(stdin),只有当多个数据流被追加到文件时,才有必要用用>>

    find . -type f -name "*.c" -exec cat {} ;>all_c_files.txt  #将当前目录下所有c程序文件拼接起来写入文件

    find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ; #将大于10天的txt文件移动到OLD目录下

    修剪,跳过指定目录

    find dev/folder ( -name ".git" -prune ) -o ( -type f -print ) # 排除.git目录,打印所有文件的名称和路径

    只查看目录下非隐藏的文件, 试了下,如果不加-o选项,则-prune不会起作用

    4. xargs

    有些命令无法接收stdin数据流,xargs能够将标准输入数据先格式化,转换成命令行参数

    将多行转换成单行输出, xargs默认是按照“ ”空格来格式化的

    -n 指定每行最大参数数量

    -d 指定定界符,注意是区分大小写的

    -I 选项指定一个替换字符串

    cat args.txt | xargs -I {} ./test.sh -p {} -l

    相当于 .test.sh -p arg1 -l

    test.sh -p arg2 -l

    与 -i 的区别

    与find的结合

    误区: find . -type f -name "*.txt" -print | xargs rm -f

    无法预测find输出结果的定界符究竟是' '还是空格' ',很多文件名中含有空格

    误删了hell文件,但是hell test.txt没删掉,因为xargs是以空格为定界符的

    find . -type f -name "*.txt" -print0 | xargs -0 rm -f

    xargs -0 将作为指定的定界符

    统计每个txt文件的行数

    5. tr

    对来自标准输入的字符进行替换,删除以及压缩。无法通过命令行参数接收输入

    tr后面的两个参数需要等长,如果前面短,则截断后面;如果前面长,则后面的用最后一个字符补齐

    -d 删除

    -s 压缩,可以用来去除多余空格

    $[ ] 是执行算术运算

    字符类替换

    alnum: 字母和数字;   alpha: 字母;    cntrl: 控制字符

    digit: 数字;   graph: 图形字符;  lower: 小写

    upper: 大写;    print: 可打印字符;   punct: 标点符号

    space: 空白字符;   xdigit: 十六进制

    6. 产生tmp文件

    或者使用$RANDOM

    或者temp_file=/tmp/var.$$,在脚本中,$$会被扩展成当前运行脚本的进程id

    7. 生产固定大小的文件

    dd if=/dev/zero bs=100k count=1 of=data.file

    生成大小为100kb而文件内容全部是0

    8. 字符串截取

    ${var%.*},删除位于%右侧的通配符(.*)所匹配的字符串,通配符从右向左匹配

    贪婪模式

    ${var#.*},删除位于#左侧通配符(.*)所匹配的字符串,通配符从左向右匹配

    9. 批量文件重命名

    rename 'y/A-Z/a-z/' *  #大写替换成小写,*匹配所有文件

    find . -type f -exec rename 's/ /_/g' {} ;   #将所有文件里的空格替换成_

    10. 自动化交互

    #!/bin/expect
    
    spawn kinit sryan
    expect "Password*"
    send "Mypassword
    "
    expect eof # interact
    

    spawn: 启动你要自动化的的进程

    expect:需要等待的信息

    send: 要发送的信息

    expect eof: 指明命令交互结束

    interact: 将交互状态保留给控制台,例如ssh进入后,如果不加这句,就会退出,而不是留在远程服务器上

  • 相关阅读:
    离散数学概论
    Linux内核分析
    程序的本质
    常见bug分析
    java编程思想--学习心得
    领域特定语言--心得
    Linux下网卡配置
    ubuntu下安装python的gevent模块遇到的一个问题
    二分图的最小点覆盖和最大独立集
    win7通过ssh远程登录mininet虚拟机,运行wireshark并通过x11在宿主机显示图形界面
  • 原文地址:https://www.cnblogs.com/ryansunyu/p/9193747.html
Copyright © 2011-2022 走看看