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进入后,如果不加这句,就会退出,而不是留在远程服务器上

  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/ryansunyu/p/9193747.html
Copyright © 2011-2022 走看看