整理一下日常开发中linux下的常用命令:
-
根据进程名找到进程id 并且kill掉
$ps ux | grep demo userzhao+ 378 0.0 0.0 10540 552 tty1 S 21:30 0:00 ./demo1 # 找到进程id $ps ux | grep demo | grep -v grep | awk '{print $2}' 378 # 然后kill掉 xargs 是个好东西 # xargs -t 表示输出对应的命令 $ps ux | grep demo | grep -v grep | awk '{print $2}' | xargs -t kill -9 kill -9 378
-
grep某个区间时间段的日志
$ grep "2019-05-21 14:42:4[5-6]" dpkg.log 2019-05-21 14:42:45 status not-installed linux-headers-generic:amd64 <none> 2019-05-21 14:42:45 status installed linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 2019-05-21 14:42:45 remove linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 <none> 2019-05-21 14:42:45 status half-configured linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 2019-05-21 14:42:45 status half-installed linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 2019-05-21 14:42:46 status config-files linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 2019-05-21 14:42:46 status config-files linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 2019-05-21 14:42:46 status config-files linux-headers-4.15.0-50-generic:amd64 4.15.0-50.54 2019-05-21 14:42:46 status not-installed linux-headers-4.15.0-50- generic:amd64 <none> 2019-05-21 14:42:46 status installed linux-headers-4.15.0-50:all 4.15.0-50.54
# 查询cpu 80~89之间的日志 grep "cpu : 8[0-9]%" *.log
cat out.log [20210708 23:29:01.645568] cpu usage: 0% [20210708 23:29:06.642943] cpu usage: 1% [20210708 23:29:11.643244] cpu usage: 2% [20210708 23:29:16.640893] cpu usage: 3% [20210708 23:29:21.642805] cpu usage: 4% [20210708 23:29:26.646420] cpu usage: 5% // 查看cpu操过3%的记录 grep "cpu" out.log | awk -F'%' '{print $1}'|awk '{if ($NF > 3) print $0}'
其他的grep,find的相关的alias:
https://www.jianshu.com/p/ea22a699e456 -
awk使用substr打印前n个字符
$ cat /etc/passwd | awk -F : '{print substr($1,0,3)}' roo dae bin sys syn gam man
-
性能指标查询的相关命令
top -b > profile.log # 记录某个时间的cpu和内存状态 top -H -p pid # 查看某个进程下面的线程cpu状态 free -g # 查看内存 iotop # 查看io pidstat -p pid # 查看某个进程
-
mysql 在shell上面直接执行查询
mysql -uroot -e "use information_schema;select * from COLUMNS limit 1;"
-
查找相关的命令 grep的结果高亮显示 --color=auto
// 查找文件中包含某个字符串的 grep "xxxxx" xxx.log --color=auto grep -rn "xxxx" xxx.log // 查找包含某个字符串的文件名 find . -name "table*" // # 寻找是table开头的文件名 find . -name "*table*" // # 寻找包含table的文件名
-
统计文件中单词的数量
$ cat test.txt welcome shell welcome to shell shell #方法1: $ cat test.txt| awk '{for(i=1; i<=NF;i++){a[$i]++}} END{for(key in a){print key" "a[key]}}' to 1 welcome 2 shell 3 #方法2: $ cat test.txt | tr " " "\n" | awk '{if($1 != ""){a[$1]++}} END{for(key in a){print key" "a[key]}}' to 1 welcome 2 shell 3
-
sort 排序
$ cat out.txt 1 1000 40 2 900 20 3 600 80 # 默认从小到大 $ sort out.txt 1 1000 40 2 900 20 3 600 80 # 相反的排序 $ sort -r out.txt 3 600 80 2 900 20 1 1000 40 # 根据第3列排序 $ sort -k 3n out.txt 2 900 20 1 1000 40 3 600 80
-
uniq去重
cat testfile hello world friend hello world hello #cat testfile | sort |uniq friend hello world
shell的基本语法
- 定义变量的时候,不能加空格
a=100 # 不能加空格
- 条件判断必须要加空格
#判断等于
if [ $a1 = $b1 ] #必须加上空格
then
echo "eq"
else
echo "not eq"
fi
- 其他的语法:
https://github.com/zhaozhengcoder/CoderNoteBook/blob/master/note/bash%26shell%E7%BC%96%E7%A8%8B.md
- 简单的shell操作
# 这基本上是变量的替换
path="/var/www"
cd $path
cp -r $src_code_path $build_name
- shell操作数据库
# 使用shell再数据库上面创建database
src_db_user=root
build_db_name=test
mysql -u $src_db_user << EOF 2>/dev/null
CREATE DATABASE $build_db_name
EOF
if [ $? -eq 0 ]
then
echo "created DB"
else
echo "DB already exists, sh exit"
exit 1;
fi
Shell中通常将 EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。 可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。
参考:https://blog.csdn.net/wyl9527/article/details/72655277
- shell结合sed命令
src_db_host=10.12.235.102
build_db_host=10.12.235.102
# sed 替换到匹配到的内容
sed -i "s/host=${src_db_host}/user=${build_db_host}/g" file
# sed 替换到匹配到这一行
sed -i "/${src_db_host} /c ${build_db_host}" file
- shell拿到命令执行的结果
# 打印一个目录下面所有的php文件
for file in `ls | grep .php`
do
echo $file
done
- shell中常见到的
0:表示键盘输入(stdin)
1:表示标准输出(stdout),系统默认是1
2:表示错误输出(stderr)
1>/dev/null:表示标准输出重定向到空设备文件。
也就是不输出任何信息到终端,不显示任何信息。
2>&1:表示标准错误输出重定向等同于标准输出。
因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
-
shell 结合ini文件
example.ini:DBNAME=test DBUSER=scott DBPASSWORD=tiger
example.sh
#!/bin/bash #Including .ini file . example.ini echo "${DBNAME} ${DBUSER} ${DBPASSWORD}"
shell的符号
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
shell函数
- shell函数的例子
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello
- shell函数处理输入和返回输出
# input /var/www/
# output \/var\/www\/
handle_path_str()
{
echo $1 | sed 's#\/#\\\/#g'
}
build_path= /var/www/
build_path_str="$(handle_path_str $build_path)"