Skip to content
helloc edited this page Jun 14, 2022 · 9 revisions

Table of Contents


Linux

获取根目录

WORKSPACE=$(readlink -f $(dirname $0)/..)
WORKSPACE=$(cd $(dirname $0)/..; pwd)

获取IP地址

/sbin/ifconfig eth0|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"

字符串操作

var="http://example/a.com"

# 获取字符串长度
>>> echo ${#var}
20

# '#'最小限度 砍前面(*在分隔符之前)
>>> echo ${var#*/}
/example/a.com

# '##'最大限度 砍前面(*在分隔符之前)
>>> echo ${var##*/}
a.com

# '%'最小限度 砍后面(*在分隔符之后)
>>> echo ${var%/*}                                                                                                                                           
http://example

# '%%'最大限度 砍后面(*在分隔符之后)
>>> echo ${var%%/*}
http:

# 指定字符
>>> echo ${var:1:9}
ttp://ex

# 左数第几个字符直到结束
echo ${var:start}
>>> echo ${var:2}
tp://example/a.com

# 右数第几个字符直到结束
echo ${var:0-start}
>>> echo ${var:0-3}
com

# 从右边第几个字符开始以及字符的个数
echo ${var:0-start:len}
>>> echo ${var:0-5:3}
a.c

数组操作

array=(
    'abc'
    'def'
    'xyz'
    )

# 输出数组长度: 3
echo ${#array[@]}

# 遍历输出数组元素及其索引: 0:abc 1:def 2:xyz
for i in ${!array[@]};do
    echo $i:${array[$i]}
done

# 遍历输出数组元素: abc def xyz
for x in ${array[@]};do
    echo $x
done

SSH

秘钥登录堡垒机

  1. .zshrc content
eval `ssh-agent -s`
./vpn.sh
ssh username@ip -p port
  1. vpn.sh content
#!/usr/bin/expect
spawn ssh-add xxx.pem
set timeout 10
expect "*xxx.pem:" {send "password\n"}
expect eof
exit
  1. chmod 755 vpn.sh

远程执行命令

# 远程机器执行(加双引号)
sshpass -p'password' ssh root@ip -o StrictHostKeyChecking=no "sh /root/gate.sh $TARGET_BRANCH"

# 与本地机器交互(不加引号)
sshpass -p'password' scp root@ip:/root/pytest.html $WORKSPACE/pytest.html

systemctl

  1. centos: /usr/lib/systemd/system/xxx.service ubuntu: /lib/systemd/system/xxx.service
[Unit]
Description=Devpi Server
After=syslog.target network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/python2 /usr/bin/devpi-server --role=master --host=0.0.0.0
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. systemctl daemon-reload
  2. systemctl enable xxx.service

mysql

# 迁移数据库全部表结构(不包含数据)
mysqldump --opt -uroot -p[password] -d [old_database] | mysql -uroot -p[paasword] [new_databse]

# 迁移单表结构和数据
mysqldump -uroot -p[password]  -B [old_database] --tables [table_name] | mysql -uroot -p[password] [new_database]

# 导出
mysqldump -uroot -p[password] dbname > dbname.sql 
mysqldump -uroot -p[password] --all-databases > data.sql

# 导入方法1
mysql -uroot -p[password] < data.sql
# 导入方法2
mysql> source data.sql;

Python

GIL

多线程适用于阻塞式IO场景,不适用于并行计算场景。

Python的标准实现是CPython。CPython执行Python代码分为2个步骤:首先,将文本源码解释编译为字节码,然后再用一个解释器去 解释运行字节码。字节码解释器是有状态的,需要维护该状态的一致性,因此使用了GIL(Global Interpreter Lock,全局解释器锁)。

GIL的存在,使得CPython在执行多线程代码的时候,同一时刻只有一个线程在运行,无法利用多CPU 提高运算效率。但是这个特点也带来了一个好处:CPython运行多线程的时候,内部对象缺省就是线程安全的。这个特性,被非常多的Python库开发者所依赖,直到CPython的开发者想要去除GIL的时候,发现已经有大量的代码库重度依赖这个GIL带来的内部对象缺省就是线程安全的特性,变成一个无法解决的问题了。

虽然多线程在并行计算场景下无法带来好处,但是在阻塞式IO场景下,却仍然可以起到提高效率的作用。这是因为阻塞式IO场景下,线程在执行IO操作时并不需要占用CPU时间,此时阻塞IO的线程可以被 挂起的同时继续执行IO操作,而让出CPU时间给其他线程执行非IO操作。这样一来,多线程并行IO操作 就可以起到提高运行效率的作用了。 综上,Python的标准实现CPython,由于GIL的存在,同一个时刻只能运行一个线程,无法充分利用多CPU提升运算效率,因此Python的多线程适用于阻塞式IO的场景,不适用于并行计算的场景。

编码与解码

编码就是编成字节码。字符串根据utf8编码encode为字节码,字节解码decode对应的字符串。

有一个UTF-8编码的文件,需要转码成GBK编码的文件:decode('utf-8') —> encode('gbk'),注意这里文件就是字节码。
字符转成字节的方法: encode('utf8')

decode('utf8') --> unicode --> encode('gbk')
   |                                |   
 utf8                              gbk
   |                                |   
encode('utf8') <-- unicode <-- decode('gbk')

Python tricks

  • 获取工作目录
from os.path import dirname, abspath
FILE_PATH = abspath(__file__)
DIR_PATH = dirname(abspath(__file__))
PAR_DIR = dirname(dirname(abspath(__file__)))
  • 去除文件空白行
lines = list(filter(None, (line.strip() for line in reader)))
  • 每隔n个字符切割字符串
lines = [_str[idx:idx+n] for idx,val in enumerate(_str) if idx % n == 0]
  • 列表生成式
nums = [[0 for y in range(2)] for x in range(5)]
  • 字典按values值逆序排序
sorted(result.items(), key=lambda item: item[1], reverse=True)
  • 列表排序,0移到最后
nums = [2, 0, 0, 1, 5]
nums.sort(key=bool, reverse=True)

# nums = [2, 1, 5, 0, 0]
  • json导出对象
with open('result.json', 'w') as writer:
    json.dump(my_obj, writer, default=lambda o: o.__dict__, ensure_ascii=False, indent=4)

Pylint

# pylint --generate-rcfile > ~/.pylintrc

[MESSAGES CONTROL]
disable=C0111,
        C0301,
        W0703,

Clone this wiki locally