首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
函数参数与返回值
传递变长参数
defer 和追踪
内置函数
递归函数
将函数作为参数
闭包
应用闭包:将函数作为返回值
使用闭包调试
计算函数执行时间
通过内存缓存来提升性能
声明和初始化
切片
For-range 结构
切片重组(reslice)
切片的复制与追加
字符串、数组和切片的应用
声明、初始化和 make
测试键值对是否存在及删除元素
for-range 的配套用法
map 类型的切片
map 的排序
将 map 的键值对调
标准库概述
regexp 包
锁和 sync 包
精密计算和 big 包
自定义包和可见性
为自定义包使用 godoc
使用 go install 安装自定义包
自定义包的目录结构、go install 和 go test
通过 Git 打包和安装
Go 的外部包和项目
在 Go 程序中使用外部库
结构体定义
使用工厂方法创建结构体实例
使用自定义包中的结构体
带标签的结构体
匿名字段和内嵌结构体
方法
类型的 String() 方法和格式化描述符
垃圾回收和 SetFinalizer
当前位置:
首页>>
技术小册>>
go编程权威指南(二)
小册名称:go编程权威指南(二)
Linux中有很多非常实用的工具或命令,灵活运用这些工具,可以帮助我们在Shell编程中化繁为简,如虎添翼。可能一个工具或命令就能让原本负责的问题快速解决,本章节我们来一起丰富我们的工具库,日常可以多积累总结,帮助我们更好的编写Shell。 1\. sort -------- **简介**:顾名思义,就是用来排序的工具,在我们日常工作中对于重复列的多行输出,如果想要对内容按照特定规则排序,此时就用到了sort工具。 **原理**:sort 将文件的每一行作为一个单位,相互比较,比较原则默认情况是从首字符向后,依次按 ASCII 码值进行比较, 后将他们按升序输出。 **语法**:`sort [OPTION]... [FILE]…` **选项说明**: * **\-t**:指定以什么作为列分割 * **\-k**:用来制定利用那列进行排序,通常`-t`于`-k`配合使用 * **\-r**:将文本文件降序输出 * **\-n**:以数组来进行生序排序 * **\-f**:忽略大小写字母 * **\-u**:取消重复的行 在此我们不全部展开起所有选项,只根据日常经验结合实际案例列举最常用的选项进行说明。 **实例**: * 对/etc/passwd中以uid从大到小排序 [root@10-234-1-235 ~]# sort -t: -k3 -n -r /etc/passwd saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin gitlab-www:x:498:497::/var/opt/gitlab/nginx:/bin/false git:x:497:496::/var/opt/gitlab:/bin/sh gitlab-redis:x:496:495::/var/opt/gitlab/redis:/bin/false gitlab-psql:x:495:494::/var/opt/gitlab/postgresql:/bin/sh gitlab-prometheus:x:494:493::/var/opt/gitlab/prometheus:/bin/sh mongod:x:493:492:mongod:/var/lib/mongo:/bin/false 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 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/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@master ~]# 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 /sbin/nologin /sbin/nologin /bin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin ```bash [root@master ~]# awk -F":" '{print $NF}' /etc/passwd |sort |uniq -c |sort -nr 22 /sbin/nologin 1 /sbin/shutdown 1 /sbin/halt 1 /bin/sync 1 /bin/nologin 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. 小结 ------ Shell 编程就是利用工具加数据结构流程控制实现一组操作,所以掌握更多常用的工具或命令非常利于我们编写 Shell 脚本,平时可以多尝试利用各种命令或工具,并在 Shell 中熟练运用它们,勤练并反思总结,归纳整理,日积月累就会形成自己强大的工具库。
上一篇:
shell编程-awk
下一篇:
shell编程实战-拉git代码
该分类下的相关小册推荐:
Go 组件设计与实现
Go开发基础入门
Go开发权威指南(下)
Golang并发编程实战
深入浅出Go语言核心编程(七)
Go-Web编程实战
从零写一个基于go语言的Web框架
Go Web编程(中)
go编程权威指南(一)
Golang修炼指南
Go Web编程(上)
Go进阶之分布式爬虫实战