以下是shell的命令记录
status/true > /dev/null 2>&1
这个命令的意思是:后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空.
所以可以看出" >/dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出。
grep -w
grep -w用于字符串精确匹配
若文件中的内容包括如下:
262 a3
262
26
如果 grep ‘26’ file,结果是三行全部都被显示
若要精确匹配26所在行
使用grep -w ‘26’ file
grep -v 是反向查找的意思,比如 grep -v "grep" 就是查找不含有 grep 字段的行; grep -v ^# /etc/profile就是不显示以#开头的行
例如 ps -ef | grep '/home/helife/tomcat-wap/' | grep -v "grep"
查看包含 '/home/helife/tomcat-wap/' 但不包含 "grep" 的进程
grep -e
显示文件中符合条件的字符
查找当前目录下所有文件中包含字符串”Linux”的文件,会将含有Linux字符串的所有文件匹配出来。
以下命令在后台执行 root 目录下的 runoob.sh 脚本:
#nohup
nohup /root/runoob.sh &
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程 (常用ps aux | grep xxx)
test命令用法
功能:检查文件和比较值
1)判断表达式
if test (表达式为真)
if test !表达式为假
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真
2)判断字符串
test –n 字符串 字符串的长度非零
test –z 字符串 字符串的长度为零
test 字符串1=字符串2 字符串相等
test 字符串1!=字符串2 字符串不等
3)判断整数
test 整数1 –eq 整数2 整数相等
test 整数1 –ge 整数2 整数1大于等于整数2
test 整数1 –gt 整数2 整数1大于整数2
test 整数1 –le 整数2 整数1小于等于整数2
test 整数1 –lt 整数2 整数1小于整数2
test 整数1 –ne 整数2 整数1不等于整数2
4)判断文件
test File1 –ef File2 两个文件具有同样的设备号和i结点号
test File1 –nt File2 文件1比文件2 新
test File1 –ot File2 文件1比文件2 旧
test –b File 文件存在并且是块设备文件
test –c File 文件存在并且是字符设备文件
test –d File 文件存在并且是目录
test –e File 文件存在
test –f File 文件存在并且是正规文件
test –g File 文件存在并且是设置了组ID
test –G File 文件存在并且属于有效组ID
test –h File 文件存在并且是一个符号链接(同-L)
test –k File 文件存在并且设置了sticky位
test –b File 文件存在并且是块设备文件
test –L File 文件存在并且是一个符号链接(同-h)
test –o File 文件存在并且属于有效用户ID
test –p File 文件存在并且是一个命名管道
test –r File 文件存在并且可读
test –s File 文件存在并且是一个套接字
test –t FD 文件描述符是在一个终端打开的
test –u File 文件存在并且设置了它的set-user-id位
test –w File 文件存在并且可写
test –x File 文件存在并且可执行
sed -i.bak 备份加替换
sed -i.bak "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config #之后会出现没有原文件config.bak(config里面的内容已经被替换了)
操作文件:sed.c
i love you
name id year
twoname id year
sed命令:
n命令-->移动到匹配行的下一行
sed -i '/i love you/{n;s/year/year1/;}' sed.c
里面的内容就会变成
i love you
name id year1
twoname id year
#------------经典shell脚本的例子----------------
#可以根据数字可以循环执行多次
#!/bin/bash
if [ 'all' == 'all' ]; then
i=0
while :
do
if [ $i -le 20 ]; then
sleep 0.1
i=$[$i + 1]
echo $i
continue
else
echo $i
echo "curl -s -d 'step=ex}}sendpost/"
fi
done
fi
#linux系统中let命令在bash中用于计算,变量名前不用加$,可以实现自加和自减操作
[root@linuxprobe test]# a=3
[root@linuxprobe test]# echo $a
3
[root@linuxprobe test]# b=a+4
[root@linuxprobe test]# echo $b
a+4
[root@linuxprobe test]# let b=a+4 ## let可以实现变量前不加$的计算
[root@linuxprobe test]# echo $b
7
# expr可以把子字符串的转化成数字
# let只能用于计算
#!/bin/bash
for i in $(seq 1 1 9) # seq是一个命令 1 表示i的初值 2 表示i的成长 10表示i的最大值(相当于python中的range命令)
do
if [ $(expr $i) -lt 10 ];then
dir_num="0${i}"
echo $dir_num
else
dir_num=${i}
fi
mkdir -p data/preparegok/MGUserServer${dir_num}
done
#判断语句
if list then
do something here
elif list then
do another thing here
else
do something else here
fi
等于(Equal):-eq;
不等于(Not Equal):-ne;
大于 (Greater Than):-gt;
小于(Lesser Than):-lt;
小于或等于(Lesser or Equal):-le;
wait和&
wait作用与解释:
等待作业号或者进程号制定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有制定参数,则等待所有子进程的退出,其退出状态为0.
如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。
在shell中使用wait命令,相当于高级语言里的多线程同步。
&和&&
a & b 表示a和b同时运行
a && b表示 a运行成功后再运行b
总结:使用多进程的思想进程进程的管理,辉大大减少时间消耗。而通过最少的时间消耗达到与单线程执行的同样的事情。
例子:如下(创建九个目录会减少一半的时间)
for i in $(seq 1 1 9);do
{
if [ $(expr $i) -lt 10 ];then
dir_num="0${i}"
echo $dir_num
else
dir_num=${i}
fi
mkdir -p data/preparegok/MGUserServer${dir_num}
} &
done
wait
echo "over this threah!!!!"
# 变量里面有变量用eval这个命令
eval echo "数组最后一个元素为\${my_array[$len_arr]}"
# 反向查找出需要删除的文件删除
find -not -name {{typeid}}_{{jarFilename}}|grep zip|xargs rm -rf
# jinja语法中在列表中使用索引查找列表中的某一元素
{{ key.0 }}
# jinja语法中添加元素至列表
{% set t = [] %}
{% for i in rang(20) %}
{% t.append(i) %}
{% endfor %}
kill 掉匹配的所有进程
如,要 kill 掉 swoole 相关的进程
ps aux | grep swoole | awk '{print $2}' | xargs kill -9
shell 判断文件夹或文件是否存在
# 文件夹不存在则创建·
if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi
# 文件存在则删除
if [ ! -f "/data/filename" ];then
echo "文件不存在"
else
rm -f /data/filename
fi
# 判断文件夹是否存在
if [ -d "/data/" ];then
echo "文件夹存在"
else
echo "文件夹不存在"
fi
# 判断文件是否存在
if [ -f "/data/filename" ];then
echo "文件存在"
else
echo "文件不存在"
fi
# 文件比较符
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
逻辑判断‘和’与‘或’
# 和
if [ ! $1 == 1 ] && [ $2 ==2 ] ; then
echo “OK!”
fi
if [ ! $1 == 1 -a $2 ==2 ] ; then
echo “OK!”
fi
# 或
if [ ! $1 == 1 ] || [ $2 ==2 ] ; then
echo “OK!”
fi
if [ ! $1 == 1 -o $2 ==2 ] ; then
echo “OK!”
fi
Linux打印显示时间具体使用参数如下:
1、输出当前年月日
echo $(date +%F)
2、输出当前时间(时分)
echo $(date +%R)
3、输出当前时间(时分秒)
echo $(date +%T)
4、输出星期
echo $(date +%A)
5、组合输出日期时间
5.1
echo $(date +%Y/%m/%d)
5.2输出时分秒
echo $(date +%H:%M:%S)
5.3输出年月日时分秒
echo $(date +%F%n%T)
# sed各种例子
sed -i '/index.php/c\ {{DisplayModule}};' ./XXX.conf # 替换index.php那一行的内容
sed -i -e '/string/{n;d}' file# 删除匹配行的上一行(string为匹配字符串)
sed -i -e '$!N;/\n.*string/!P;D' file # 删除匹配行的下一行:
字符串截取
python
os.getenv('PYTHONPATH') # 获取机器环境上的变量
1、获取当前目录,相当于shell中的pwd命令
>>> os.getcwd()
'/private/var/root'
2、改变当前脚本目录,相当于shell中的cd命令
>>> os.chdir('/tmp/')
>>> os.getcwd()
'/private/tmp'
3、创建目录,相当于shell中的mkdir -p命令,我们可以看到当我们创建了目录之后,就可以直接使用chdir切换到刚才的目录下面了。
>>> os.makedirs('/tmp/yeyz/test')
>>> os.chdir('/tmp/yeyz/test')
>>> os.getcwd()
'/private/tmp/yeyz/test'
当然,还有一个os.mkdir()的命令,这个命令相当于shell中没有使用-p参数时候的情况,如果该目录存在,则无法创建成功。
4、递归删除,相当于rm -rf 命令
>>> os.removedirs('/tmp/yeyz/test')
>>> os.chdir('/tmp/yeyz/test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/tmp/yeyz/test'
>>> os.chdir('/tmp/yeyz/')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/tmp/yeyz/'
>>> os.chdir('/tmp/')
>>> os.getcwd()
'/private/tmp'
我们可以看到,当我们删除掉之后,再想进入之前的目录,就会报错了。
5、列举当前目录下的所有文件,类似于shell中的ls命令
>>> os.listdir('.')
['.keystone_install_lock', 'com.apple.launchd.Haenu0YBGr', 'com.google.Keystone', 'powerlog', 'KSDownloadAction.kArMUqmIGL', 'KSInstallAction.XG3CXseysP', 'com.apple.launchd.ImXO2x8tjW', 'com.sogou.inputmethod', 'KSOutOfProcessFetcher.u4BE7MILoK']
可以看到,返回的值是一个list,拿到这个list之后,我们可以使用代码对它进行循环,然后依次进行处理
6、当然,我们可以使用os.system直接执行shell命令,如下的方法,我们使用system的方法直接执行pwd命令,和我们使用getcwd的方法的结果是一样的。
>>> os.system('pwd')
/private/tmp
0
>>> os.getcwd()
'/private/tmp'
大家可能还注意到了,返回了一个多余的0,它的意思是该命令执行成功,如果执行不成功,则会返回一个错误的code
>>> os.system('pwdddd')
sh: pwdddd: command not found
32512
7、文件名称改动,类似于shell中的mv 操作
>>> os.system('touch aaa.txt')
0
>>> os.system('ls')
aaa.txt powerlog
0
>>> os.system('pwd')
/private/tmp
0
>>> os.rename('aaa.txt','bbb.txt')
>>> os.system('ls')
bbb.txt powerlog
0
8、将目录和文件拆分成一个二元组,os.psth.split
>>> path = os.getcwd()
>>> print(os.path.split(path))
('/private', 'tmp')
这个功能还是很实用的,如果你的目录是个文件,就可以很方便的拿到这个文件的上级目录
os.path还有其他的一些函数,例如:
os.path.exists()方法可以判断当前的目录是否存在,
os.path.dirname()方法,其实就是split方法的第一个元素
os.path.isfile()方法,可以判断路径是否是一个文件
os.path.isdir()方法,可以判断给的路径是否是一个文件夹
9、sys.exit(n)方法,相当于shell中异常退出的exit 1命令
在Python中,正常退出可以不用写代码,执行完毕退出的时候,exit的值就是0,当遇到异常的时候,就可以使用sys.exit(1)的方法告诉程序当前执行过程中出现了问题。
获取本机IP
#coding=utf-8
import socket
def get_host_ip():
"""
查询本机ip地址
:return:
"""
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
finally:
s.close()
return ip
if __name__ == '__main__':
print(get_host_ip())
python调用shell命令
subprocess.call(["sed -i 's/hello/hi/g' /home/b.sh"], shell=True)
# 官方推荐 subprocess模块,os.system(command) 这个废弃了
# 亲测 os.system 使用sed需要进行字符转义,非常麻烦
python用类似正则匹配出需要的值
# 筛选出data_list中所有的dog并保存在new_data_list中
import re
data_list = ['cat_1', 'dog_1', 'dog_2', 'cat_2', 'dog_3', 'cat_3'] # 原列表中既有dog也有cat, 并且无规律
new_data_list = [] # 保存筛选出来dog的列表
for data in data_list: # 遍历列表
if re.match('dog.*', data) != None: # 如果正则匹配出的数据不为None, 就将此数据添加到新列表中
new_data_list.append(data)
print(new_data_list)
python的key使用正则
from re import search, I
class RegexMap:
def __init__(self, n_dic, val):
self._items = n_dic
self.__val = val
def __getitem__(self, key):
for regex in self._items.keys():
if search(regex, key, I):
return self._items[regex]
return self.__val
#例子
fee_dic = {r'.*?美.*?元.*?': 'USD'}
reg_fee_dic = RegexMap(fee_dic, None)
print(reg_fee_dic['*美元'])
print(reg_fee_dic['美^元'])
print(reg_fee_dic['美元%'])
print(reg_fee_dic['人民币'])
# 输出:
'USD'
'USD'
'USD'
None
数字金字塔