记录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

 

posted @ 2017-04-24 12:10  晚来秋  阅读(407)  评论(0编辑  收藏  举报