记录Linux中遇到的技巧
压缩排除.svn目录
打包test目录,排除其中所有子目录中的.svn文件夹:
# tar -zcf test.tar.gz test/ --exclude=.svn
# zip -qr test.zip test/ -x "**/.svn**"
npm安装模块命令
npm安装模块时经常出现权限错误,可以用下面的参数:
# npm install --unsafe-perm=true --allow-root
创建免密登录
在需要免密登录的发起端执行,命令2中使用接收端的用户名和IP:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub [username]@[ip address]
时间同步
安装crontab,配置每6个小时向ntp服务器同步一次时间:
# yum -y install vixie-cron # crontab -e 0 */6 * * * /usr/sbin/ntpdate [ntp server ip] > /dev/null 2>&1
sort命令常用
# sort -r # 降序,默认为升序
# sort -f # 忽略大小写
# sort -n # 按数字排序,默认为字符
# sort -u # 重复的行只打印一次
# 常用与uniq配合
sort | uniq # 去除重复行,结果就是无论唯一的还是重复的都只打印一次
sort | uniq -d # 只打印有重复的行,而且只打印一次
sort | uniq -u # 只打印没有重复的行
sort | uniq -c # 统计重复行数
# sort -h # 使用易读性数字排序,比如1K、2M、3G等
# 常见与du配合
du -sh * | sort -h # 统计文件大小,以易读性数字显示,并排序
# sort -k 2 # 通过第2列排序,列的分隔默认以一个或多个空格或制表符
# sort -t , -k 2 # 以逗号分隔后,通过第2列排序
# sort -k 2 -k 1 # 优先以第2列排序,若相同再以第1列排序
# sort -k 2n -k 1r # 优先以第2列按数字排序,若相同再以第1列降序排
sed命令常用
# sed -i "1 i [内容]"[path/to/file] #开头插入一行
# sed -i "$ a [内容]" [path/to/file] #末尾插入一行
# sed -i "[行号] i [内容]" [path/to/file] #指定行前插入一行(行号从1开始)
# sed -i "[行号] a [内容]" [path/to/file] #指定行后插入一行
# sed -i "[行号] d" [path/to/file] #删除指定行
# sed -i "/[关键字]/ i [内容]" [path/to/file] #匹配行前插入一行(所有匹配行都会操作)
# sed -i "/[关键字]/ a [内容]" [path/to/file] #匹配行后插入一行
# sed -i "/[关键字]/ d" [path/to/file] #删除匹配行
# sed -i "s/[原内容]/[新内容]/" [path/to/file] #匹配替换(每一行只替换第一个匹配的)(/可以用#或?代替防止与内容冲突)
# sed -i "s/[原内容]/[新内容]/g" [path/to/file] #匹配替换(替换所有匹配的)
# sed -i "[行号] s/[原内容]/[新内容]/g" [path/to/file] #只匹配替换指定行
# sed -i "[起始行号],[结束行号] s/[原内容]/[新内容]/g" [path/to/file] #匹配替换指定的范围
# sed -i "/[关键字]/ s/[原内容]/[新内容]/g" [path/to/file] #只匹配替换匹配关键字的行
# sed -i "s/[原内容]/[新内容]/g" `grep "[原内容]" -l \`find -name config.xml\`` #与find和grep组合使用
awk命令常用
# awk '{print $1}' filename #$1~$n 每行分隔的第n个字段;$0 整行内容;NF 字段总数 # awk '{print "字段1:"$1"\t字段2:"$2}' filename #格式化组合显示 # awk -F ',' '{print $1}' filename #用逗号分隔,默认是空格分隔 # awk -F '[,#]' '{print $1}' filename #逗号或#号分隔 # awk -F '[,#]+' '{print $1}' filename #1个或多个,#分隔,比如,,或###
# awk -F 'GET|HTTP' '{print $1}' filename #以GET或HTTP分隔
# awk '{print "\""}' filename #print输出双引号
# awk '{print "'\''"}' filename #print输出单引号
# awk '{if(NR==1||(NR>2&&NR<4)) print $0}' #行数=1或3>行数>2;其他还有>=,<=,!=;若有多个文件NR会递增叠加,不递增单独计算的是FNR
# awk 'BEGIN {count=0;print "开始统计行数"} {print $0;count++} END{print "统计结束,行数是",count}' #自定义变量,统计行数,打印每行内容
# awk '/^#/' filename #正则匹配,以#开头的行
# awk '!/^#/' filename #不以#开头的行
# awk -F ',' '/^#/ {print $1}' filename #配合-F和print,分隔并打印匹配的行
# awk -F '[,#]+' '{count[$7]++} END{for(i in count){print count[i]"\t"i}}' *.log #分隔后,统计第7个字段不同内容各自出现的次数
# awk '{if($0~/^1/) print "第"NR"行以1开头";else if($0~/^2/) print "第"NR"行以2开头";else print "第"NR"行以其他开头"}' filename #if else语句,相对于~,!~表示不匹配
批量删除BOM
# sed -i "s/\xEF\xBB\xBF//" `grep -Ilr $'^\xEF\xBB\xBF' .` #查到当前文件夹所有子目录中包含BOM的文件,然后删除BOM
批量处理^M
注意:^M在Linux命令行输入的方式是 ctrl+v,ctrl+m;
# sed -i "s/^M//" `grep "^M" -lr .` #查到当前文件夹所有子目录中包含^M的文件,然后删除
vim修改fileformat
:set ff #查看fileformat :set ff=dos #配置fileformat为dos :set ff=unix #配置fileformat为unix :%s/^M$//g #删除所有的^M(^M=ctrl+v,ctrl+m)
vim删除重复行
:sort #先排序
:g/^\(.*\)$\n\1$/d #删除重复行
内存buff/cache清理
系统频繁大量读写文件会造成内存buff/cache过高,比如:
此时可以用以下命令进行清理:
sync;echo 1 >/proc/sys/vm/drop_caches 清理pagecache
sync;echo 2 >/proc/sys/vm/drop_caches 清理dentries和inodes
sync;echo 3 > /proc/sys/vm/drop_caches 都清理
查看进程中的线程
# ps -efL | grep java // 查看所有的java线程
# ps -mp [pid] -o THREAD,tid,time,start // 线程信息,线程id,累计占用cpu时间,启动时间
杀死所有匹配的进程
# ps -ef | grep [关键字] | grep -v grep | awk '{print $2}' | xargs kill -9
Java内存信息
FGC监控,导出堆栈信息:
# jstat -gct [pid]@[ip] 1000 10 # jmap -dump:format=b,file=[path/to/file] [pid] # jstack -l [pid] > [path/to/file]
切换到上一次的目录
# cd -
使用上条命令的参数
# ll /mydata # cd !$ cd /mydata/
用curl下载文件
# curl -OL "download url"
Linux命令行下载jdk包
windows下用浏览器访问jdk的网址,比如:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
找到要下载的包,右键,复制链接地址,如下图:
然后在Linux命令行:
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" [复制的地址]
或
curl -H "Cookie: oraclelicense=accept-securebackup-cookie" -H "Connection: keep-alive" -O -L "[复制的地址]"
配置时区
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
不支持zh_CH.utf8的处理
# localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 # sed -i "$ a export LANG=zh_CN.UTF-8" /etc/profile
history增加用户和时间
# sed -i '$ a export HISTTIMEFORMAT="%F %T `whoami` "' /etc/bashrc
查看进程启动和持续时间
常用的 ps -ef 中能看到的两个时间分别是进程启动时间和累计使用cpu的时间,如果进程启动超过24小时启动时间就只显示日期,若要看精确的启动时间和持续时间,可以用下面的命令:
# ps -p [pid] -o lstart,etime # lstart 精确的启动时间, etime 进程的持续时间
ls显示更容易处理的日期和时间
ls命令有一个参数--time-style,其默认为locale,中文环境下用 ls -l ,文件的日期时间通常会显示为这样不方便处理的格式:
dr-xr-x---. 26 root root 4096 3月 10 10:19
dr-xr-xr-x. 19 root root 4096 7月 5 2019
若加上参数 --time-style=long-iso 则为:
dr-xr-x---. 26 root root 4096 2020-03-10 10:19
dr-xr-xr-x. 19 root root 4096 2019-07-05 18:32
对于写脚本时提取日期时间会方便很多。
若平时也想用这个格式,但每次都要加参数太麻烦了,可以定义环境变量:
export TIME_STYLE=long-iso
或者修改ll别名的定义(centos7中位于/etc/profile.d/colorls.sh):
alias ll='ls -l --color=auto --time-style=long-iso' 2>/dev/null
创建空的大文件
# if=输入的文件,of=输出文件,bs=块大小 ,count=块数量
shell> dd if=/dev/zero of=bigfile bs=1M count=1024 # 意思是创建一个名为bigfile、大小为1G的文件
统计到本机连接数前10的IP地址
shell> ss -nt | grep ESTAB | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -10
打印指定行的内容
shell> awk 'NR==5' /path/to/file shell> sed -n '5 p' /path/to/file shell> awk 'NR>=1 && NR<=5' /path/to/file shell> sed -n '1,5 p' /path/to/file
tr命令常用
shell> echo "aaa bbb" | tr [:lower:] [:upper:] # 小写转大写 shell> echo "aaa bbb" | tr a-z A-Z # 小写转大写 shell> echo "aaa bbb" | tr -d " " # 删除空格
0~100中3的倍数
shell> for i in {0..100..3}; do echo $i; done
Shell中的变量
shell> v="/usr/bin/bash" shell> echo ${v:1:3} # 索引1开始长度为3,结果是:usr shell> echo ${v#*/} # 结果是:usr/bin/bash shell> echo ${v##*/} # 结果是:bash shell> echo ${v%/*} # 结果是:/usr/bin shell> echo ${v%%/*} # 结果为空
shell> echo ${v//bash/grep} # 结果为:/usr/bin/grep
Shell中的对比
[ $n -gt 0 ] | 是否大于0 |
[ $n -lt 0 ] | 是否小于0 |
[ $n -eq 0 ] | 是否等于0 |
[ -z $string ] | 判断字符串是否为空 |
[ ! -z $string ] | 判断字符串是否不为空 |
[ -n $string ] | 判断字符串是否不为空 |
[[ $string == "" ]] | 判断字符串是否为空 |
[[ $string == "字符串" ]] | 判断字符串是否相等 |
[[ $string == 字* ]] | 判断字符串是以“字”开头 |
Shell中的数组
shell> array=("my" "name" "is") # 初始化 shell> echo ${array[0]} # 打印第一个元素 shell> echo ${array[@]} # 打印整个数组 shell> echo ${#array[@]} # 元素个数 shell> echo ${!array[@]} # 所有索引 shell> array[10]="John" # 增加元素
网段中在线的IP
seg='192.168.0' for i in $(seq 254) do ping -c 1 ${seg}.${i} >> /dev/null if [ $? -eq 0 ];then echo "${seg}.${i} online" else echo "${seg}.${i} offline" fi done