Linux常用命令总结

1. 过滤掉空行和注释行

$ grep -Ev '^$|[#;]' filename

2. 杀死僵尸进程

$ ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

3. 生成随机数

 $ openssl rand -base64 8 
 $ openssl rand -base64 80

4. 查看CPU核数

# 查看物理CPU个数
$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看逻辑CPU个数
$ cat /proc/cpuinfo| grep "processor"| wc -l

# 查看每个物理CPU中core的个数(即核数)
$ cat /proc/cpuinfo| grep "cpu cores"| uniq

5. 统计访问Nginx的IP数

$ awk '{print $1}' access.log | sort -n | uniq | wc -l

6. 对一列数字求和

$ seq 1 5 | awk '{sum+=$1} END{print sum}'

7. 统计每个用户的进程占用了多少内存

 $ ps aux | awk 'NR!=1{a[$1]+=$6} END {for (i in a) print i ", " a[i]/1024"M";}'

8. 释放内存

# 在执行释放内存之前,先执行 sync 将所有正在内存中的缓存写到磁盘,避免丢失数据
$ sync

$ echo 1 > /proc/sys/vm/drop_caches # 释放页缓存
$ echo 2 > /proc/sys/vm/drop_caches # 释放目录和inodes
$ echo 3 > /proc/sys/vm/drop_caches # 释放所有缓存

9. vim常用操作

  • ctrl + d:向下翻半页
  • ctrl + u:向上翻半页
  • ctrl + 4:光标移到一行最左端
  • ctrl + 6:光标移到一行最右端
  • zz:让光标所在行处于屏幕中央
  • zt:让光标所在的行居屏幕最上面
  • zb:让光标所在的行居屏幕最下面
  • ctrl + G:移动到文件末尾
  • gg:移动到文件首行
  • u:撤销最近一次的操作
  • y:复制当前行,会复制换行符
  • yy:只复制当前行内容
  • yyp:复制当前行到下一行
  • ddp:当前行和下一行交换位置

10. vim替换操作

# 替换当前行第一个tom为jerry
:s/tom/jerry/

# 替换当前行所有的tom为jerry
:s/tom/jerry/g

# 替换从第n行到最后一行中,每一行的第一个tom为jerry
:n,$s/tom/jerry/

# 替换从第n行到最后一行中,每一行的每个tom为jerry
:n,$s/tom/jerry/g

11. vim配置快捷添加注释信息

通过修改vimrc的配置文件来实现。vimrc文件一般是在家目录下的 .vimrc 或者是在 /etc/vimrc 。配置步骤如下:

编辑 vim /etc/vimrc,在文件最下方添加如下内容

map <F1> :call TitleDet()<cr>
function AddTitle()
    call append(0,"\#!/bin/sh")
    call append(1,"# ******************************************************")
    call append(2,"# Author       : syushin")
    call append(3,"# Last modified: ".strftime("%Y-%m-%d %H:%M"))
    call append(4,"# Email        : moliyoyoyo@163.com")
    call append(5,"# blog         : https://www.cnblogs.com/syushin/")
    call append(6,"# Filename     : ".expand("%:t"))
    call append(7,"# Description  : ")
    call append(8,"# ******************************************************")
    echohl WarningMsg | echo "Successful in adding copyright." | echohl None
endf

function UpdateTitle()
     normal m'
     execute '/# Last modified/s@:.*$@\=strftime(":\t%Y-%m-%d %H:%M")@'
     normal ''
     normal mk
     execute '/# Filename/s@:.*$@\=":\t".expand("%:t")@'
     execute "noh"
     normal 'k
     echohl WarningMsg | echo "Successful in updating the copyright." | echohl None
endfunction

function TitleDet()
    let n=1
    while n < 10
        let line = getline(n)
        if line =~ '^\#\s*\S*Last\smodified\S*.*$'
            call UpdateTitle()
            return
        endif
        let n = n + 1
    endwhile
    call AddTitle()
endfunction

上面配置表示,打开一个新的文件时,点击一下F1就可以实现在文件首部添加注释信息。

点击F1,效果如下:

image-20220407105647361

12. 在shell中发起一个curl带变量的post请求

有时候,需要在shell中用curl命令发起一个post请求,请求数据是json格式并且json的字段名和值都是变量,这时候可以这样做:

#!/bin/bash
username="syushin"
password="123456"
curl http://192.168.1.10:8888/login.html  \
-H "Accept: application/json" \
-H "Content-Type: application/json" \  
-d '{
    "name": '"username"',
    "pwd": '"password"'',
}' 

变量格式: '"变量名"'

13. 批量删除文件

$ find ./ -type f -name "*.txt" | xargs rm 

$ find ./ -type f -name "*.txt" -exec rm -f {} \;

$ find ./ -type -f -name "*.txt" -delete

14. 批量备份文件

[root@web syushin]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  backup
[root@web syushin]# ls backup/
[root@web syushin]# find ./ -type f -name "*.txt" | xargs -i cp -a {} backup/
[root@web syushin]# ls backup/
1.txt  2.txt  3.txt  4.txt  5.txt

15. date命令去掉无用的0

比如日期 2021-09-07,去掉0就变成了 2021-9-7,只需要在 %m 中间加 - 即可,如下:

$ date +%Y-%m-%d
2021-09-07

$ date +%Y-%-m-%-d
2021-9-7

16. redis批量删除前缀相同的keys

注意:在线上不建议使用,测试开发环境可以使用

$ redis-cli -a 密码 -p 端口号 -n 库号 KEYS "指定key前缀_*" | xargs redis-cli -a 密码 -p 端口号 -n 库号 del

17. Linux查询大目录

# 类似于默认情况的du,但是,递归显示时的递归深度小于等于N,如果--max-depth=0,就相当于-s参数,如果--max-depth=1,就相当于du -s 目录/*
$ du -h --max-depth=1

18. curl命令不显示统计信息

# 执行curl命令时,会返回这样的% Total % Received % 统计信息
$ curl www.baidu.com  > 1.log
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2381  100  2381    0     0  28084      0 --:--:-- --:--:-- --:--:-- 28345

# 不显示统计信息加上 -s 即可
$ curl -s www.baidu.com  > 1.log

19. tar使用多线程进行压缩

tar 是单线程的压缩,压缩起来很慢,可以使用 pigz工具辅助,就可以使用多线程了(需要多核CPU)。

centos7 下安装

$ yum -y install pigz

测试,不使用 pigz 工具的打包:

# 文件夹大小 529
$ du -sh src
529M	src

# 使用time命令,查看tar命令耗时
$ time  tar -zcvf src.tar.gz src
......
real	0m19.772s
user	0m19.029s
sys	0m1.318s

大概需要19秒,接下来使用 pigz 工具试试

# 使用 --use-compress-program 选项,指定压缩工具为pigz
$ time tar --use-compress-program=pigz -cvpf src2.tar.gz src
......
real	0m3.902s
user	0m29.522s
sys	0m0.951s

只需要3.9秒,真香。

20. docker设置容器开机自启

docker有个 --restart 参数,参数值如下:

  • no:默认策略,在容器退出时不重启容器
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3:在容器非正常退出时重启容器,最多重启3次
  • always:在容器退出时总是重启容器

将正在运行的容器设为自启动

# docker update --restart=always 容器名或容器ID
$ docker update --restart=always <CONTAINER ID>

将自启动的容器取消自启动

# docker update --restart=no 容器名或容器ID
docker update --restart=no <CONTAINER ID>

21. Linux 删除特殊字符文件名的文件

比如ls 的时候看到这样的文件,想删除掉

$ ls 
?x?Mc?ܴ 

使用转义字符去删除不好使,通过如下命令解决

# 通过ls -i 查看文件的 inode 号
$ ls -li
51635093 -rw-r--r--   1 root root        0 Jul 12 13:58 ?x?Mc?ܴ 

# 结合 find 命令进行删除
$ find ./ -inum 51635093 -delete

22. curl命令获取http状态码

$ curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com
200

选项说明:

  • -I:仅测试 http 头
  • -m 10:最多查询 10s
  • -o /dev/null:屏蔽原有的输出信息
  • -s:slient 模式,不输出任何东西
  • -w %{http_code}:控制额外输出

23. sed 命令去除空格

$ sed 's/[[:space:]]//g'

24. vim 多列编辑

多行注释

1. 进入vim,按esc进入命令行模式,按 ctrl + v 进入可视化编辑,左下角会出现(-- VISUAL BLOCK --)
2. 在行首使用键盘上下键选择需要注释掉的行
3. 选好之后,按下键盘 shift + i,即大写的 I,进入插入模式
4. 然后输入注释的符号,#或者其他符号
5. 最后按下 esc 键,稍等1-2秒,选中的行就会在行首出现 # 号了。

取消多行注释

1. 首先按esc进入命令行模式下,按下Ctrl + v, 进入列模式;
2. 选定要取消注释的多行;
3. 按下“x”或者“d”. 注意:如果是“//”注释,那需要执行两次该操作,如果是“#”注释,一次即可

25. 查找空文件并删除

$ find ./log -size 0c | xargs rm -f

26. 利用 date 命令比较时间大小

显示时间戳

$ date +%s 
1696667408

将时间戳转换为指定格式时间

$ date -d @1696667408  +"%Y-%m-%d %H:%M:%S"
2023-10-07 16:30:08

利用时间戳比较两个时间大小

$ cat test.sh
#!/bin/bash

time1=`date +%s`
sleep 2
time2=`date +%s`

time_format1=`date -d @$time1 +"%Y-%m-%d %H:%M:%S"`
time_format2=`date -d @$time2 +"%Y-%m-%d %H:%M:%S"`

if [ $time1 -lt $time2 ];then
  echo "$time_format1 早于 $time_format2"
else
  echo "$time_format1 晚于 $time_format2"
fi

$ sh test.sh 
2023-10-07 16:37:24 早于 2023-10-07 16:37:26
posted @ 2020-07-03 15:32  syushin  阅读(344)  评论(0编辑  收藏  举报