美文网首页
Shell 脚本攻略-命令行之乐

Shell 脚本攻略-命令行之乐

作者: 羊陆之交 | 来源:发表于2018-03-19 08:46 被阅读0次

    Cat

    • -n 会显示行号;-b 也会显示行号,但不计空格

    find

    • 基本用法:find path -name "file_name.txt"

    • 忽略大小写:-iname

    • 搜索路径:-path, -regex

    • 否定参数:find . ! -name "*.txt",会查找除 txt 文件之外的所有文件

    • 限定目录递归深度:-maxdepth,-mindepth

    • 限定文件类型:-type,f 表示常规文件,d 表示目录

    • 根据时间搜索:

      command 说明
      -atime 访问时间,以天为单位
      -mtime 文件内容的修改时间
      -ctime 文件元数据的修改时间 (权限或所有者)

      -amin,-mmin,-cmin 含义类似,只是时间的单位为分钟

    • 限定文件大小:-size,常用的单位有 b, k, M, G

    • 对找到的文件执行命令:find . -name "*.txt" -exec printf "Text file: %s\n" {} \;{} 会被替换成搜索到的文件名称

    xargs

    Script

    args.txt

    arg1
    arg2
    arg3
    

    test.sh

    #!/bin/bash
    echo $* '#'
    

    Output

    • cat args.txt | xargs ./test.sh
      输出结果为:
      arg1 arg2 arg3 #

    • cat args.txt | xargs -n 2 ./my_sh.sh
      输出结果为:

    arg1 arg2 #
    arg3 #
    

    Note

    • xargs 不带任何可选项时,会将 '\n' 替换为 ' ',合并为一行后作为后续命令的参数。
    • 可选项 -n 2 表示一行只有 2 个参数

    tr

    是转换 (translate) 的缩写。

    • 基本用法 echo "hello world" | tr [a-z] [A-Z],将小写字母转换为大写
    • -d 表示删除。echo "abc 123 12" | tr -d [0-9],将数字删除
    • -s 表示连续重复的字符只保留一个。echo "abc 1233 112" | tr -s " 1",将连续的空格和1只保留一个

    sort

    • 默认以字典序排序
    • -n 以数字排序
    • -r 逆序排序
    • -k 以第几列排序,列之间通过空格区分
    • -z 排序结果以 \0 分隔,通过和 xargs -0 结合使用

    uniq

    • 默认只保留一行连续的相等的行
    • -u 只显示唯一的行
    • -c 增加重复的统计计数
    • -d 只显示重复的行
    • -s num 忽略从首字符开始的字符数,-w 2 最大的比较的字符宽度

    基于字符切分字符串

    Script

    #!/bin/bash
    name=shell.cook.book
    head1=${name%.*}
    head2=${name%%.*}
    
    echo head1: $head1
    echo head2: $head2
    
    name2=www.google.com
    tail1=${name2#*.}
    tail2=${name2##*.}
    
    echo tail1: $tail1
    echo tail2: $tail2
    

    Output

    head1: shell.cook
    head2: shell
    tail1: google.com
    tail2: com
    

    Note

    • 脚本中的 .* 是指匹配点以及后面的任意个字符,点可以换成其他需要被切分的字符
    • %# 是非贪婪匹配,%%## 是贪婪匹配

    rename

    • rename *.JPG *.jpg
    • rename 's/ /_/g' *,替换文件名中的空格为下划线

    并行运行多个命令

    #!/bin/bash
    pids=()
    for file in file1.txt file2.txt
    do
            md5 $file &
            pids+=("$!")
    done
    
    wait ${pids[@]}
    

    相关文章

      网友评论

          本文标题:Shell 脚本攻略-命令行之乐

          本文链接:https://www.haomeiwen.com/subject/vyluqftx.html