linux命令
linux比较完善的速查手册:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
shell语言备忘录
系统常量
# 特殊常量
echo "File Name: $0"
echo "1st Parameter : $1"
echo "2nd Parameter : $2"
echo "all Parameter: $@"
echo "all Parameter: $*"
echo "Total Number of Parameters : $#"
echo "ppid : $$"
变量类型
- 数组
query_arr=("滤芯" "净水器滤芯" "鲜花" "美国移民")
字符串
- 赋值(等号左右不允许有空格,x="xxx")
- 字符串拼接(例子如下)
- 注意点
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 双引号可以变量替换
- 反引号(命令替换)
x="fufufufu" date=`date -d 'yesterday' '+%m%d'` echo $x echo ${x} echo "test-"$x echo "this is y ${x}" # 注意: ''中变量不会转义 echo 'this is y ${x}'
注释
- 单行#
- 多行(比较麻烦暂时忽略)
流程控制
- if
- for
#-gt是大于
#-lt是小于
#-eq是等于
#-ne是不等于
#-ge是大于等于
#le是小于等于
if [ -z "$1" ]
then
echo "No arguments supplied "$1
else
if [ "$1" -gt 10 ]
then
echo "参数大于10:"$1
else
echo "参数小于10: "$1
fi
fi
# for i in {1..10}
# do
# echo $i
# done
# (( ))
# for((i=1;i<100;i++))
# do
# if((i%10==0))
# then
# echo $i
# continue
# fi
# done
#
for File in 1 2 3 4 5
do
echo ${File}'12345'
done
常用命令
类型 | 命令 | 作用 |
---|---|---|
文件操作 | ls 20161.log ls20160[1-9].log | 正则方式筛选输出 |
文件操作 | tar --exclude="umi-demo/node_modules" -zcvf target.tar.gz sourcefile | 压缩 |
文件操作 | gzip -9 xx | 会覆盖源文件 |
文件操作 | tar -zxvf target.tar.gz | 解压缩 |
文件操作 | du -hs path | 查看文件大小(Mb单位) |
文件操作 | df | 磁盘情况预览 |
文件操作 | cp -r xx yy | 递归方式拷贝(拷贝所有文件和文件夹) |
文件操作 | wget http://a.com/b.jpg -P pic/ | wget指定文件存放的目录 |
文件操作 | chmod 755 imgcat chmod +x xx.sh chmod -x xx.sh | imgcat是imgcat.sh去掉了后缀名,可以直接./imgcat(shimgcat.sh) |
文件操作 | scp -r username@servername:/path/filename /target/path | 拷贝别人开发机的文件(-r拷贝所有文件和文件夹) |
文件操作 | find . -name'*.png' -depth2 | 深度为2时查找png文件 |
hadoop | hadoop fs -getmerge /app/2016data.txt | 2016目录下的所有文件merge到data.txt中 |
hadoop | hadoop fs -cat,-ls,-dus,-rmr | fs类型的多种操作 |
进程 | ps -ax ps-le¦grepnode | 查看进程,加上grep进行各种过滤 |
字符处理 | iconv -f 'utf-8' -t 'gbk' a.tx > b.txt | utf8 => gbk |
字符处理 | grep -o 'xxx' data.txt ¦ wc -l grep -r 'name' ./ grep -a1 'name' ./ | data.txt中的xxx的出现次数 查看当前目录下面的所有含有name字符串的文件 输出上下一行(a1), 下一行(A1) |
字符处理 | sed 's/\t/,/g' data.txt | data.txt中的tab > ',' |
字符处理 | sed -n '5,10p' data.txt sed -n '10p' data.txt cat nohup.out¦ head -n 100 cat nohup.out¦ tail -n 100 | 看5-10行,看第10行,头100,尾100 |
sort | sort -n -r -k2 -t':'result > result_sorted | key:value形式的文件按照value进行排序 |
其他 | date +%Y-%m-%d date -d yesterday +%Y%m%d date -d tomorrow +%Y%m%d date -d '30 days ago' +%Y%m%d | 时间获取 |
其他 | tailf nohup.out | 一旦nohup.out更新就去刷新输出 |
其他 | crontab -e | 定时任务配置 |
其他 | git remote -v | git查看remote仓库地址 |
其他 | npm list --depth=12 > /dev/null | 查看npm以及目录安装的包(过滤错误信息) |
sort专题
$ cat test.data
a 1
b 2
c 99
d 0
e 91
f 3
# -r 降序 -n 升序 -k1 k2 (指定排序key)
$ cat test.data | sort -k1 -n
a 1
b 2
c 99
d 0
e 91
f 3
$ cat test.data | sort -k2 -n
d 0
a 1
b 2
f 3
c 99
# 去除重复行
$ sort -n test.data | uniq
// 文件交集,并集,差集 参考下面的链接
集合A,B,A与B的差集指的是属于A且不属于B的部分
场景:文件A B,B是A的子集, A中没有在B中出现过的元素
$ cat A.txt B.txt B.txt | sort | uniq -u > ret.txt
grep专题
高亮处理 --color=auto
# match 多个关键字
grep -E 'xxx|yyy|zzz' data
# invert -match 不包含的关键字
grep -v 'xxx|yyy|zzz' data
# 输出目标结果(输出 xfuck you x)
echo "asdxfuck you x1231" | grep -o 'x.*x'
# 关于正则
## 元字符 \b \w \W
## []代表范围
grep "[0-9]" data #match 数字
grep "[789]" data #match 789
grep "[^0-9]" data #match 数字取反
grep "[^a-zA-Z0-9]" data #match 特殊字符
grep -oE '\b[a-zA-Z]+\b' words.txt #match word
## {}重复的次数
[0-9]\{1,3\} match 1~3位的数字
## *?+ 重复字符
*: 重复次数 n
>
= 0
+: 重复次数 n
>
= 1
?: 重复次数 n = 0 || 1
num* match "nummmm" "num" "nu"
num\+ match "nummmm" "num" 至少要有一个
\(re\)* match 'rerere' 和空行
\(re\)\+ match 'rerere' 去掉了空行
##例子
匹配 log中的tu字段
grep -oE "tu=u[0-9]{6,7}" --color=auto
awk专题
#!/bin/awk -f
# FS指定列分割符 OFS列输出分隔符
BEGIN{
FS = OFS = "\t";
}
{
split($1, key, "#");
new_key = key[1]"#"key[3];
if (key[2] == 0) pv1[new_key] += $2;
pv2[new_key] += $3;
clk[new_key] += $4;
gain[new_key] += $5;
cnt[new_key] += $6;
}
END{
for (i in pv1) {
print i, pv1[i], pv2[i], clk[i], gain[i], cnt[i];
}
}
##脚本方式调用
-F 定义间隔符
awk -F ',' '{print $1,$4}' new_data
awk -F ',' '{print "name:"$1"\tbirthday"$4}' new_data
内置参数的使用
awk -F "," "{print NR,NF}" new_data
NR 行号 NF 字段数量
awk -F "," '{printf("Line:%s,Col:%s\n", NR,NF)}' new_data
# for 输出没有按照下标来的
$ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4
2 is
3 a
4 test
1 this
# 文件夹文件大小总计
ls -l | awk 'BEGIN{size=0} {size+=$5} END{print "size is " size}'
# stat 非空行数
awk 'BEGIN{cout=0} $1!~/^$/ {cout+=1} END{print "line number is"cout}' list_data
# stat第5行后面的数据
awk -F ',' 'BEGIN{cout=0} {if (NR
>
5) name[cout++]=$1} END{for(i=0;i
<
cout;i++) print i,name[i] }' list_data
curl进行请求
# 其他细节可以 curl -h 自己查看
curl -i -X POST \
-H "application/x-www-form-urlencoded; charset=UTF-8" \
-d \
'{"pageNo":"2","pageSize":"10"}' \
'http://cpu.baidu.com/1003/d77e414'
## get 请求
curl -G http://imageplus.baidu.com/ui
## curl 带上 cookie请求
curl --cookie "name=fuckyou" http://xx.com/api
for循环发送请求
query_arr=("滤芯" "净水器滤芯" "鲜花" "美国移民");
for((i=1;i
<
=50;i++));
do
query_idx=`expr $i % 4`;
curl -i -X POST \
-H "application/x-www-form-urlencoded; charset=UTF-8" \
-d \
'{"magic_num":778,"channel_page":"pc_ns_wenku_yuedu_tab","query":"'${query_arr[$query_idx]}'","pre_query":"'${query_arr[$query_idx]}'","search_id":2292132705,"charge_name":"ksws3","encode_type":0,"experiment_id_list":[2018011603],"user_ip":2319884839,"baidu_id":"A46A9B49722108FC124D78FF6C451418","passport_user_id":0,"url":"https://p.baidu.com/question/7b4f6162633531346463360200/398307","refer":"http://p.baidu.com","device_info":{"user_agent":"Mozilla/5.0"},"service_control":{"union_title":"十二生肖之六合","union_charge_tag":"tag1##tag2"},"cookie_info":[],"http_headers":"","wise_req_info":{"wise_adapter":"","wpt": 2}}' \
'http://10.150.93.38:8101/asp'
done
post发送formdata形式的请求
#!/bin/bash
curl \
-F "code=GBK" \
-F "name=woshinimamamam" \
-F "file=@/Users/baidu/Desktop/xx.txt" \
xxyyzzaabbcc.baidu.com:8089/amis/download/word-table/upload?AMIS_USER=xishengbo
环境变量添加
# 新增了一个hadoop client
export PATH=$PATH:/home/xishengbo/hadoop_client_yq/hadoop/bin
svn
svn commit -m “恢复到某修订版(某修订版作废)”
权限赋予
理解 文件、目录的权限的不同 r w x
让 xxx.sh 可执行即为 ./xxx.sh 运行
chmod 777 xxx.sh
让 xxx.cpp不可执行
chmod -x xxx.cpp
模板测试服务的快速重启
rm lu-ui
rm ../log/*log*
wget http://10.145.78.238:8114/output/bin/lu-ui
chmod 777 lu-ui
kill $(ps aux | grep 'bin/lu-ui' | awk '{print $2}')
进程放入后台以及切换到前台
vim界面下 ctrl + z (其他占用终端的进程也是一样)
要回到前台
jobs 查看当前后台任务
通过 fg 1 切换回来
文件大小排序
ls -Slgrepr
tmux的使用
用于缓存自己的开发环境 不用每次开发的时候都重新打开环境
tmux
tmux ls
tmux kill-server
tmux kill-session -t s_name
tmux attach -t s_name
ctrl + b + n/p (next previous window)
ctrl + b + $ (rename)
ctrl + b + % (split window 水平方向)
ctrl + b + " (split window 竖直方向)
ctrl + b + l (split window switch)
重新命名窗口: ctrl + b + ,
关闭tab: ctrl + b + x
断开连接 ctrl + b + d
tmux使用了主题 感觉样式可以
>
>
https://github.com/shfshanyue/tmux-config
>
>
https://segmentfault.com/a/1190000003001555
mysql操作
mysql -uUSERNAME -pPASSWORK -P4100 -hHOST test_db --default-character-set=utf8
mysql -uxishengbo -pWNXhRY4L9Q -P4100 -hst01-dba-sdc-bak03.st01 cb_webdb --default-character-set=utf8
waptuList="111,2222,333"
select ad_param from ad_demand where ad_position_id in ($waptuList)
order by create_time
group by group_id
DATE_FORMAT(st_date, "%Y-%m-%d")
// like的用法
like "%xsb%"
not like '%"tag_orient":""%'
// 正则用法
SELECT name FROM person_tbl WHERE name REGEXP '^st';
网络相关
## 查看请求baidu.com 数据包所经过的IP节点 一般用于问题排查
traceroute baidu.com
netstat 查看本机端口的状态
发压力测试
ab -c 2 -n 10 http://127.0.0.1:8800?c=1
&
b=1
各类限制条件自己看参数吧 get post都能发的
观察/bin有没有完全启动起来的方法
- 通过top命令 看改程序的 cpu占用情况,一般刚开始启动 占用很高(做各种初始化工作,载入配置等等)
- tailf 观察log目录log,一般启动完成后 日志量开始增加
git相关
“在分支开发提交了好多次,其中一次merge master冲突,最后合入失败可以用这个办法处理(相当于回滚之前的多次 commit,适用于分支没有push的场景)”
git reset --soft origin/master
git commit --amend // 提交后还没push的情况下update commit msg
git reset --hard origin/master # 强制用 remote 覆盖本地
git diff commitid1 commitid2 查看某两个版本之间的差异
git diff commitid1:xx.txt commitid2:xx.txt 查看某两个版本的某个文件之间的差异
git stash 已有的变更不想保存的时候 想切换到其他分支上或。。。 将修改放入堆栈
git stash list 看看有哪些堆栈
git stash drop stash@{2} 删除这个修改
git stash apply stash@{2} 恢复到 stash@{2} 这个变化
https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%EF%BC%88Stashing%EF%BC%89
git commit --amend 注意事项: 有的时候一部小心把 change id 改没了,再去提交就会出现下面的提示(所以amend操作也有分险,公司内网的git有过定制化配置会有changeid输出,外网的github检查了一下没有changeid)
vim
set list 来显示非可见字符
set nolist 隐藏
制表符被显示为“^I”,而行尾则标识为“$“
%s/,/\r/g 都好替换成换行(\r vim 里面表示换行)
cat
asdfasd asdfads
asdfads
dafd asdfads
d asdfads
fd asdfads
asa sd
asa sd
sa sd
vim
asdfasd asdfads$
>
---asdfads$
dafd
>
---asdfads$
d
>
--asdfads$
fd
>
-asdfads$
asa
>
sd$
asa
>
sd$
sa
>
-sd$
linux环境变量相关使用方法
echo 显示某个环境变量值 echo $PATH
export 设置一个新的环境变量 export HELLO="hello" (可以无引号)
env 显示所有环境变量
set 显示本地定义的shell变量
unset 清除环境变量 unset HELLO
/*test.js*/
console.log(process.env.PORT, "this is port");
/*
env PORT=8093 node test.js
export PORT=8093
&
&
node test.js
result: 8093 this is port
*/
fis使用
fis3 release -wL (watch模式动态 release)
fis3 release -d ./output (打包文件到某个目录)
fis server start stop restart