AWK 使用

AWK

样式扫描和处理语言

概念

  • RS:Record Separator,记录分隔符。

  • ORS:Output Record Separate,输出当前记录分隔符。

  • FS:Field Separator,字段分隔符。

  • OFS:Out of Field Separator,输出字段分隔符。

  • NF:Number of Field,行中字段的个数。
  • NR:Number of Row,当前处理的行数。

参数

-F 字段分隔符
awk -F":" '{print $0}' /etc/passwd

$0 整行
$1 以“:”冒号分割的第一列
$2 以“:”冒号分割的第二列

NF==7 字段数量
NR==2 纪录数量

用 awk 中查看服务器连接状态并汇总

1
netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'

统计 web 日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小, 总访问流量的大小汇总

1
awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]|"sort -rn -k1";print "total size is :"total}' /app/log/access_log

数值转换,16进制转换魏10进制

1
adb shell getevent /dev/input/event2 | awk '{print "adb shell sendevent /dev/input/event2  "strtonum("0x"$1)" "strtonum("0x"$2)" "strtonum("0x"$3); fflush()}'  >> unlock.sh
1
awk '{print "adb shell sendevent /dev/input/event2  "strtonum("0x"$1)" "strtonum("0x"$2)" "strtonum("0x"$3); fflush()}'

fflush()立刻刷新缓存到文件。

查看 NF 数量

1
ifconfig eth0 | awk -F [" "]+ '{print "NF =", NF, $0}'

awk -F “[ :]+”

[“ “]+这个是正则表达式,+表示一个或多个,这里就表示一个或多个空格。

拆分行

1
curl -s https://testerhome.com/api/v3/topics.json | awk 'BEGIN{RS="}},{"}{print $0}'

RS=”}},{“ }},{

合并行

1
awk '{if(NR%4!=0)ORS=" ";else ORS="\n"}1'

每4行合并为1行。

从file文件中找出长度大于80的行

1
awk 'length>80' file

按连接数查看客户端IP

1
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

打印99乘法表

1
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

参考

The GNU Awk User’s Guide

AWK单行脚本快速参考
awk之RS、ORS与FS、OFS

AWK 简明教程 | | 酷 壳 - CoolShell

mkdir aws
cd aws
pipenv –python=/Users/jinlong/.pyenv/versions/3.6.3/bin/python
pipenv –python=/Users/jinlong/.pyenv/versions/2.7.14/bin/python
sed -i “” “s/python.org/douban.com/g” Pipfile

AWS-Cli

AWS-Cli
AWS-Cli 不支持Python3(2017.12.11)
pipenv install awscli

aws configure

输入Identity and Access Management

AWSAccessKeyId
AWSSecretKey

~/.aws/credentials
[default]
aws_access_key_id=foo
aws_secret_access_key=bar

[testing]
aws_access_key_id=foo
aws_secret_access_key=bar

Boto 3

Boto 3

pipenv install boto3

Bash 使用

macOS 10.13.2
iTerm2 3.1.2
zsh 5.3 (x86_64-apple-darwin17.0)

快捷键

生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率。

macOS下 Alt 被替换为 Esc

编辑命令

命令补全

1
2
3
4
5
Tab     用于命令补全

^I      可用于命令补全

^[      相当于Esc,也可补全

删除命令

1
2
3
4
5
6
7
8
Ctrl + u :从光标处删除至命令行首
Ctrl + k :从光标处删除至命令行尾
Ctrl + w :从光标处删除至字首
Alt + d :从光标处删除至字尾
Ctrl + d :删除光标处的字符
Ctrl + h :删除光标前的字符
^B     删除光标所在字母
^Y     粘贴或恢复上次的删除

移动命令

1
2
3
4
5
6
7
8
^P 、^N、 ^B、 ^F      方向键 上 下 左 右
Ctrl + a :移到命令行首
Ctrl + e :移到命令行尾
Ctrl + f :按字符前移(右向)
Ctrl + b :按字符后移(左向)
Alt + f :按单词前移(右向)
Alt + b :按单词后移(左向)
Ctrl + xx:在命令行首和光标之间移动
1
2
3
4
5
6
7
8
9
Ctrl + y :粘贴至光标后
Alt + c :从光标处更改为首字母大写的单词
Alt + u :从光标处更改为全部大写的单词
Alt + l :从光标处更改为全部小写的单词
Ctrl + t :交换光标处和之前的字符
Alt + t :交换光标处和之前的单词
Alt + Backspace:与 Ctrl + w ~~相同~~类似,分隔符有些差别 [感谢 rezilla 指正]
Ctrl+Alt+E  扩展命令行
Esc+T    置换前两个单词

重新执行命令

1
2
3
4
5
6
7
8
Ctrl + r:逆向搜索命令历史
Ctrl + g:从历史搜索模式退出
Ctrl + p:历史中的上一条命令
Ctrl + n:历史中的下一条命令
Alt + .:使用上一条命令的最后一个参数
Alt+P    非增量方式反向搜索历史

Alt+>    历史列表中的最后一行命令开始向前

控制命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Ctrl + l:清屏
Ctrl + o:执行当前命令,并选择上一条命令
Ctrl + s:阻止屏幕输出
Ctrl + q:允许屏幕输出
Ctrl + c:终止命令
Ctrl + z:挂起命令
Bang (!) 命令
^S    锁住屏幕

^Q    恢复屏幕

^C    杀死当前进程

^\    停止当前进程

^D    退出当前shell

&      后台执行,(nohup以忽略挂起信号方式运行程序)

^Z    把当前进程转后台运行

jobs    查看当前后台作业状态

fg     将后台作业拿到前台处理

bg    作业在后台运行
^L    清屏

^M或^J  回车

!!:执行上一条命令

1
2
3
4
5
6
7
8
9
!blah:执行最近的以 blah 开头的命令,如 !ls
!blah:p:仅打印输出,而不执行
!$:上一条命令的最后一个参数,与 Alt + . 相同
!$:p:打印输出 !$ 的内容
!*:上一条命令的所有参数
!*:p:打印输出 !* 的内容
^blah:删除上一条命令中的 blah
^blah^foo:将上一条命令中的 blah 替换为 foo
^blah^foo^:将上一条命令中所有的 blah 都替换为 foo

命令小坑

echo

时间处理

时间戳转换为时间

1
date -d @时间戳 "+%Y-%m-%d %H:%M:%S"
1
awk '{print strftime("%Y-%m-%d %H:%M:%S",$1)}'

如果是毫秒级的时间戳要先除以1000

参考

1.GNU文档:http://www.gnu.org/software/bash/manual/

2.鸟哥的私房菜:http://linux.vbird.org/linux_basic/0320bash.php

3.IBM的一些bash教程:http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?sort_by=&show_abstract=true&show_all=&search_flag=&contentarea_by=Linux&search_by=bash&topic_by=-1&type_by=%E6%89%80%E6%9C%89%E7%B1%BB%E5%88%AB&ibm-search=%E6%90%9C%E7%B4%A2

Caddy 部署实践

Caddy

Caddy Web服务器QUIC部署

QUIC在微博中的落地思考

Examples for using Caddy Web Server

本站开启支持 QUIC 的方法与配置

使用caddy配合nginx支持QUIC

1
wget https://github.com/mholt/caddy/releases/download/v0.10.12/caddy_v0.10.12_linux_amd64.tar.gz
1
2
3
tar xf caddy_v0.10.12_linux_amd64.tar.gz

mv caddy /usr/local/bin/

/usr/local/bin/caddy -quic -log stdout -agree=true -conf=/data/caddy/Caddyfile -root=/var/tmp –port=32457

mkdir -p /data/caddy/log/

1
2
3
4
5
6
7
8
vim /data/caddy/Caddyfile

ovwane.com:444 {
tls /data/ssl/ovwane.com/ovwane.com_rsa_fullchain.cer /data/ssl/ovwane.com/ovwane.com_rsa.key
root /data/www/ovwane.com/public
gzip
log /data/caddy/log/ovwane.com.log
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
vim /usr/lib/systemd/system/caddy.service

[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Restart=on-abnormal

; User and group the process will run as.
;User=caddy
;Group=caddy

; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/data/caddy

; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
ExecStart=/usr/local/bin/caddy -quic -log stdout -agree=true -conf=/data/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID

; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s

; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Unmodified caddy is not expected to use more than that.
LimitNPROC=512

; Use private /tmp and /var/tmp, which are discarded after caddy stops.
PrivateTmp=true
; Use a minimal /dev (May bring additional security if switched to 'true', but it may not work on Raspberry Pi's or other devices, so it has been disabled in this dist.)
PrivateDevices=false
; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
ProtectHome=true
; Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
; … except /etc/ssl/caddy, because we want Letsencrypt-certificates there.
; This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
ReadWriteDirectories=/data/caddy

; The following additional security directives only work with systemd v229 or later.
; They further restrict privileges that can be gained by caddy. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
;CapabilityBoundingSet=CAP_NET_BIND_SERVICE
;AmbientCapabilities=CAP_NET_BIND_SERVICE
;NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
1
2
3
4
systemctl enable caddy.service
systemctl start caddy.service
systemctl stop caddy.service
systemctl status caddy.service
1
netstat -lnp --inet6 | grep -F caddy

日志自动切分

vim /etc/logrotate.d/caddy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/data/caddy/log/*.log {
su root root
daily
rotate 5
missingok
notifempty
sharedscripts
dateext
postrotate
if [ -f /var/run/caddy.pid ]; then
kill -USR1 `cat /var/run/caddy.pid`
fi
endscript
}

手动执行

1
/usr/sbin/logrotate -f /etc/logrotate.d/caddy

MongoDB 配置

MongoDB

安装

mongo

拉取

1
docker pull mongo:4.2.0

运行

1
docker run -d --name mongodb-4.2.0 -p 27017:27017 -v ~/docker/mongodb:/data/db mongo:4.2.0

安装 Mongo shell

macOS

mongodb-community-shell 提供 mongo 命令。

mongodb-database-tools 提供数据库导入导出命令。

https://github.com/mongodb/homebrew-brew/blob/HEAD/Formula/mongodb-database-tools.rb

1
brew tap mongodb/brew && brew install mongodb-community-shell && brew install mongodb-database-tools

CentOS

1
yum install mongodb-org-shell-4.4.0

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

配置多副本集

https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

https://blog.yowko.com/docker-compose-mongodb-replica-set-with-auth/

1
2
3
4
openssl rand -base64 756 > keyfile
chmod 400 keyfile
# 更改用户为999
chown 999:999 keyfile

.env

1
2
3
work_dir=.
username=hogwarts
password=5Po5yaoXWAbu

用户管理

Mongodb中角色的定义:
角色说明:

  • read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
  • userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  • clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
  • dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
  • root:只在admin数据库中可用。超级账号,超级权限

添加管理员账号

1
2
3
4
5
6
db.createUser(    {
user: "root",
pwd: "UbM43zUgecBnb8v8MLiu",
roles: [ { role: "root", db: "admin" } ]
}
)

查看用户

1
2
show users
db.system.users.find()

登录

1
mongo -u "root" -p "admin" --authenticationDatabase "admin"

数据库中登陆

1
2
use admin
db.auth("root", "admin")

修改用户密码

1
db.changeUserPassword('root','密码')

常用操作

show dbs #显示数据库列表
show collections #显示当前数据库中的集合(类似关系数据库中的表)
use #切换当前数据库,如果数据库不存在则创建数据库。
db.help() #显示数据库操作命令,里面有很多的命令
db.foo.help() #显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
db.foo.find() #对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
db.foo.find( { a : 1 } ) #对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
db.dropDatabase() #删除当前使用数据库
db.cloneDatabase(“127.0.0.1”) #将指定机器上的数据库的数据克隆到当前数据库
db.copyDatabase(“mydb”, “temp”, “127.0.0.1”) #将本机的mydb的数据复制到temp数据库中
db.repairDatabase() #修复当前数据库
db.getName() #查看当前使用的数据库,也可以直接用db
db.stats() #显示当前db状态
db.version() #当前db版本
db.getMongo() #查看当前db的链接机器地址
db.serverStatus() #查看数据库服务器的状态

数据备份

1
brew install mongodb/brew/mongodb-database-tools

备份所有数据

1
mongodump --host 127.0.0.1:27017 -d stu_info -o ${PWD}

-d 指定数据库

-o 导出路径

恢复数据

1
mongorestore -h 127.0.0.1:27017 -u admin -p 123 --authenticationDatabase "admin" -d stu_info ${PWD}/stu_info

增删改查

https://docs.mongodb.com/manual/reference/program/mongo/#cmdoption-mongo-eval

https://docs.mongodb.com/manual/crud/

插入数据

1
mongo 127.0.0.1:27017/test --eval 'db.p12.insertOne({"_id":2,name:"1",phone:"13555002520"})'

查询所有数据

1
mongo --quiet 127.0.0.1:27017/test --eval 'db.p12.find().forEach(printjson)'

查询数据

1
mongo --quiet 127.0.0.1:27017/test --eval 'db.p12.find({"email" : "1212@qq.com"})'

更新数据

1
2
table_name=p12
mongo --quiet 127.0.0.1:27017/test --eval 'db.'$table_name'.update({"email" : "123@qq.com"},{$set:{"emails":"123@qq.com"}})'

参考

Docker MongoDB 部署

Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux[¶]

MongoDB Configuration File Options

安全部署MongoDB最佳实践

Mongodb之权限认证管理

Enable Auth

如何对MongoDB 3.2.7进行用户权限管理配置

MongoDB 用户的创建、删除、密码修改,角色分配

mongodb 修改用户密码 2种方法

mongodb启动不了:child process failed, exited with error number 100

https://blog.yowko.com/docker-compose-mongodb-replica-set/

#Go
安装Go

brew install go

安装分布式管理工具hg

brew install hg

建立go的环境变量文件夹

1
2
3
cd $HOME

mkdir go

~/.zshrc

1
2
3
4
vim ~/.zshrc

export GOPATH=$HOME/go
export PATH=$HOME/bin:$GOPATH/bin:$PATH

brew cask install goland

,