• shell脚本系列:常用工具


    Linux中有很多非常实用的工具或命令,灵活运用这些工具,可以帮助我们在Shell编程中化繁为简,如虎添翼。可能一个工具或命令就能让原本负责的问题快速解决,本章节我们来一起丰富我们的工具库,日常可以多积累总结,帮助我们更好的编写Shell。

    1. sort

    简介:顾名思义,就是用来排序的工具,在我们日常工作中对于重复列的多行输出,如果想要对内容按照特定规则排序,此时就用到了sort工具。

    原理:sort 将文件的每一行作为一个单位,相互比较,比较原则默认情况是从首字符向后,依次按 ASCII 码值进行比较, 后将他们按升序输出。

    语法:sort [OPTION]... [FILE]…

    选项说明:

    • -t:指定以什么作为列分割
    • -k:用来制定利用那列进行排序,通常-t于-k配合使用
    • -r:将文本文件降序输出
    • -n:以数组来进行生序排序
    • -f:忽略大小写字母
    • -u:取消重复的行

    在此我们不全部展开起所有选项,只根据日常经验结合实际案例列举最常用的选项进行说明。

    实例:

    • 对/etc/passwd中以uid从大到小排序
    [root@test-server ~]# sort -t: -k3 -n -r /etc/passwd
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    halt:x:7:0:halt:/sbin:/sbin/halt
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    sync:x:5:0:sync:/sbin:/bin/sync
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    

    通过上例可以看到,利用-t选项指定/etc/passwd文件中,以:作为列进行分割,指定uid的列为k3-n以数字进行排序,-r为倒序排序输出。

    2. uniq

    简介:对于一些重复输出的行进行去重。

    语法:uniq [OPTION]... [INPUT [OUTPUT]]

    选项说明:

    • -c: 打印出现的次数,只能统计相邻的;
    • -d: 只打印重复行;
    • -u: 只打印不重复行;
    • -D: 只打印重复行,并且把所有重复行打印出来。

    实例:

    • 对/etc/passwd中以:,对最后一列求出现的次数
    [root@test-server ~]# awk -F":" '{print $NF}' /etc/passwd
    /bin/bash
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /bin/sync
    /sbin/shutdown
    /sbin/halt
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    
    [root@test-server ~]# awk -F":" '{print $NF}' /etc/passwd |sort |uniq -c |sort -nr
         14 /sbin/nologin
          1 /sbin/shutdown
          1 /sbin/halt
          1 /bin/sync
          1 /bin/bash
    

    先利用awk打印出最后一列内容,之后利用sort 来进行排序,将相同的字符规在一起输出,最后对相同的行进行去重,得出每种不同类型shell出现的次数,最后对数学从大到小排序。

    3. find

    简介:顾名思义,就是用来在系统中查找文件的工具,可以指定一个基础起始目录,根据不同的选项查找不同的文件。

    语法:find path -option [ -print ] [ -exec -ok command ] {} ;

    原理:find 根据option在指定的系统路径中查找文件,如果查找到与对应的exec命令,则执行对应的command。

    • print: find 命令将匹配的文件输出到标准输出;
    • exec: find 命令对匹配的文件执行该参数所给出的 shell 命令。相应命令的形式为 ‘command’ {} ;,注意 {} 和 ;之间的空格;
    • ok: 和 - exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行;

    选项说明:

    - -name   filename               #查找名为 filename 的文件
    - -perm                          #按执行权限来查找
    - -user    username              #按文件属主来查找
    - -group groupname          	 #按组来查找
    - -mtime   -n +n                 #按文件更改时间来查找文件,-n 指 n 天以内,+n 指 n 天以前
    - -atime    -n +n                #按文件访问时间来查 GIN: 0px">
    - -ctime    -n +n                #按文件创建时间来查找文件,-n 指 n 天以内,+n 指 n 天以前
    - -type    b/d/c/p/l/f           #查是块设备、目录、字符设备、管道、符号链接、普通文件
    - -size      n [c]               #查长度为 n 块 [或 n 字节] 的文件
    - -depth                         #使查找在进入子目录前先行查找完本目录
    - -prune                        #通常和 -path 一起使用,用于将特定目录排除在搜索条件之外。过滤条件写在其他条件前面。
    

    在此我们对命令支持的选项全部展开详解,根据日常经验结合实际案例列举最常用的选项进行说明:

    实例:

    • 在当前目录寻找文件名称以.txt结尾的文件并打印出来
    [root@master ~]# find   ~   -name   "*.txt"   -print 
    /root/kubesphere-all-advanced-2.0.2/scripts/os/requirements.txt
    /root/kubesphere-all-advanced-2.0.2/kubesphere/roles/storages/NFS-Server/files/nfs-server-provisioner/templates/NOTES.txt
    /root/kubesphere-all-advanced-2.0.2/kubesphere/roles/ks-devops/jenkins/files/jenkins/jenkins-update-center/templates/NOTES.txt
    /root/kubesphere-all-advanced-2.0.2/kubesphere/roles/ks-devops/harbor/files/harbor/harbor/templates/NOTES.txt
    /root/kubesphere-all-advanced-2.0.2/kubesphere/roles/metrics-server/files/metrics-server/templates/NOTES.txt
    /root/kubesphere-all-advanced-2.0.2/kubesphere/roles/openpitrix/files/openpitrix/kubernetes/password.txt
    
    • 查找 /usr/bin 目录下大于 10M 的文件
    [root@master ~]# find /usr/bin -size +10000k -exec ls -ld {} ; 
    -rwxr-xr-x. 1 root root 13606800 Jul 10  2018 /usr/bin/ceph-dencoder
    -rwxr-xr-x. 1 root root 15863688 Jul 10  2018 /usr/bin/ceph-objectstore-tool
    -rwxr-xr-x. 1 root root 15589080 Jul 10  2018 /usr/bin/ceph-osd
    -rwxr-xr-x. 1 root root 33073928 Feb 10  2019 /usr/bin/docker
    -rwxr-xr-x. 1 root root 38088856 Feb 10  2019 /usr/bin/docker-containerd
    -rwxr-xr-x. 1 root root 68608416 Feb 10  2019 /usr/bin/dockerd
    -rwxr-xr-x. 1 root root 20895160 Feb 10  2019 /usr/bin/docker-containerd-ctr
    -rwxr-xr-x. 1 root root 10785264 Jul 10  2018 /usr/bin/ceph-mon
    
    • 查找当前目录下权限为 777 的文件
    [root@master ~]# find . -perm 777 -print   
    ./.helm/repository/cache/local-index.yaml
    ./kubesphere-all-v2.1.0/k8s/extra_playbooks/inventory
    ./kubesphere-all-v2.1.0/k8s/extra_playbooks/roles
    ./kubesphere-all-v2.1.0/k8s/contrib/terraform/openstack/hosts
    

    4. date

    在我们编写 Shell 的时候经常遇到需要记录日志的情况,在记录日志的时候需要打上时间戳,以便后期查看那个时间节点运行执行的操作,此时就需要用到 date 命令

    简介:date 可以用来显示或设定系统的日期与时间。

    选项:

    -d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; 
    -s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; 
    -u:显示GMT; 
    

    时间格式:

    %Y -- 年份
    %m -- 月份
    %d -- 当月第几天
    %t -- Tab 跳格
    %H -- 小时,24 小时格式 (0~23)
    %I -- 小时,12 小时格式 (0~12)
    %M -- 分钟 (00~59)
    %S -- 秒 (00~59)
    %j -- 今年中的第几天
    %Z -- 以字符串形式输出当前时区
    %z -- 以数字形式输出当前时区
    %F --  文件时间格式 same as % Y-% m-% d
    %T -- 24 小时制时间表示 (hh:mm:ss)
    
    • 实例

    计算一个命令执行所需要的耗时

    #!/bin/bash 
    start=$(date +%s) 
    echo "$(date +%F" "%T) 开始执行命令"
    sleep 5
    echo "$(date +%F" "%T) 执行命令完成"
    end=$(date +%s) 
    difference=$(( end - start )) 
    echo "执行命令总耗时:$difference seconds."
    
    [root@master ~]# bash time.sh 
    2020-04-19 10:19:58 开始执行命令
    2020-04-19 10:20:03 执行命令完成
    执行命令总耗时:5 seconds.
    

    5. xargs

    简介:xargs 全称是 transform arguments,意为转换参数,它将标准输入转换为命令行参数。因为 linux 命令行中经常要使用到管道符连接不同的命令,但是有些命令不支持标准输入,此时就需要使用 xargs 将标准输入转换为参数,

    语法:stdin_input | xargs [option] cmd

    原理:xargs 一般是通过管道符接受标准输入并将其转换为命令行参数传递给 cmd。

    实例:

    • 将标准输入转换成命令行参数
    [root@master ~]# seq 1 6
    1
    2
    3
    4
    5
    6
    [root@master ~]# seq 1 6 |xargs -n 2
    1 2
    3 4
    5 6
    
    • 删除日志文件
    ls *.log |xargs rm -r	f {} 
    
    • 查找 /home/data 下权限为 644 的文件修改权限为 600
    find /home/data -perm 644 | xargs chmod 600 
    
    • 查找 jpg 文件并打包
    find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
    
  • 相关阅读:
    每天一个linux命令(9):touch
    每天一个linux命令(8):rm
    每天一个linux命令(7):mv
    每天一个linux命令(6):cp
    每天一个linux命令(5):rmdir
    每天一个linux命令(4):mkdir
    区块链技术与应用——BTC挖矿难度
    区块链技术与应用——BTC网络工作原理
    区块链技术与应用——BTC系统实现
    区块链技术与应用——BTC的共识协议
  • 原文地址:https://www.cnblogs.com/iuskye/p/shell-tools.html
Copyright © 2020-2023  润新知