编辑人:AK
引用(张星宇发布的 “2018 年将至,iOS 工程师如何自我提高” )脚本语言非常重要,绝对是提升工作效率的神器,我强烈建议每个客户端工程师都应该了解一些 Shell 脚本并且掌握 Python,Ruby 和 JS 中至少一门语言。
理论上来说没有什么是脚本语言做得到,Java 做不到的,但脚本语言最大的特点就是快,快到极点的那种快。对于一些极度简单的小需求,比如统计一个文件中某一列数字的平均数,我敢保证在我得出结果之前你肯定还来不及打开 Java 编辑器。
脚本语言的另一个特点是高度的自动化,只要 Unix 和 Linux 系统一天不死,shell 脚本就会永远存活,你学习的知识就永远不会过期,比如 awk 和 sed 这样的神器,年龄比我大得多,至今还非常实用,未来的 20 年也丝毫看不出淘汰的迹象。试问一下,有什么知识能比一个几十年不会过期,而且每天都能用上的知识更值得学习呢?由于 Shell 是距离操作系统最近的脚本,了解了它以后,很多复杂的操作都可以被自动化。比如想找到项目中无用的图片,也就是一行命令的事
awk内建变量
变量 | 说明 |
---|---|
$0 | 当前记录(这个变量中存放着整个行的内容) |
1 1~ 1 n | 当前记录的第n个字段,字段间由FS分隔 |
FS | 输入字段分隔符 默认是空格或Tab |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 |
FNR | 当前记录数,与NR不同的是,这个值会是各个文件自己的行号 |
RS | 输入的记录分隔符, 默认为换行符 |
OFS | 输出字段分隔符, 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
FILENAME | 当前输入文件的名字 |
一,简单使用
我都是以 nestat.txt 为例子
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 192.168.16.130.55429 ec2-52-193-9-121.https ESTABLISHED
tcp4 0 0 192.168.16.130.55426 42.120.17.16.https ESTABLISHED
tcp6 0 0 im-aks-brother-2.55421 iphonex.49596 ESTABLISHED
tcp6 0 0 im-aks-brother-2.55414 iphonex.49578 ESTABLISHED
tcp6 0 0 im-aks-brother-2.55410 iphonex.49568 ESTABLISHED
tcp4 0 0 192.168.16.130.55401 ec2-34-203-25-67.https ESTABLISHED
tcp4 0 0 192.168.16.130.55399 153.35.132.52.http ESTABLISHED
tcp6 0 0 im-aks-brother-2.55361 fe80::10c0:5b06:.63596 ESTABLISHED
tcp6 0 0 im-aks-brother-2.55359 fe80::10c0:5b06:.63591 FIN_WAIT_2
tcp6 0 0 im-aks-brother-2.55354 fe80::10c0:5b06:.63584 ESTABLISHED
1,输出指定列 (第一列)
awk '{print $1}' netstat.txt
2,替换字符串,把文件中的ESTABLISHED 替换成"听"
awk 'gsub(/ESTABLISHED/,"听"); print "\n",$1,$2,$3,$4,$5,$6} ' netstat.txt
3,过滤 state 为FIN_WAIT_2的数据 其中的“==”为比较运算符。其他比较运算符:!=, >, <, >=, <=
awk '$6=="FIN_WAIT_2"' netstat.txt
二, 实用例子
1, 批量关闭打开的iTerm2应用
ps |grep iTerm2 | grep -v grep| awk '{print $1}' | xargs kill -9
2, 关闭指定端口的服务器 以 swift 服务为例子端口 8181
lsof -nP -iTCP:8181 |grep LISTEN|awk '{print $2}'|kill -9
其它
有一些记不住的地方可以去 google 查找,最主要的其实是什么时候,什么问题使用 awk 这才是要锻炼的思维方式.