掌握这十个Linux命令,秒变Linux老手

前言

在Linux下,完成一个事情往往有N种方法。Linux的一大哲学就是"一个工具只做一样事情",通过不同工具的组合使用,完成不同的需求。熟练掌握好常用命令,有时事半功倍,起到出其不意的效果。不仅大大提升你的工作效率,同时也带来喜悦感和成就感。学会下面这些命令,Linux老手也不敢小瞧你。

本文专门收集那些工作中遇到的、实用的、让人瞠目结舌、心旷神怡的好命令。

实例

1. 删除文件,文件名中可能含各种特殊字符

递归删除以“._”开头的文件:

find . -type f -name “._*” -print0 | xargs -0 rm -f

注意,加上-print0和xargs 的-0参数能解决文件中出现各种特殊字符导致命令失败的问题。

  • find命令如果输出到管道上,建议用-print0代替print,以防止输出中包含特殊字符。
  • xargs中的-0参数也是起到对特殊字符(如引号和斜杠)转义的作用。

OSX下经常要删除.DS_Store文件:

find . -type f -name “.DS_Store” -print0 | xargs -0 rm -f
或者 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

也可以用awk命令。删除所有pyc文件:

find . -name “*.pyc” |awk ‘{cmd="rm "$0;system(cmd)}’

删除文件名乱码的文件, 先找到文件的inode编号,再删除之:

ls -li
find ./* -inum 1442583 -exec rm -f {} ;

当然,递归删除目录也是如法炮制:

find . -name “.git” -print0 | xargs -0 rm -rf

上面删除当前目录下所有git仓库中的.git目录,通常这个非常吃磁盘空间。

2. 递归找出大文件

经常需要查看磁盘空间被哪些文件占用了,可以用:

du -a /dir/ | sort -n -r | head -n 20

只查找第一级目录:

du -h --max-depth=1 /var

于是,递归查找最大文件,可以这么写:

find / -type f -printf “%s\t%p\n” | sort -n | tail -1
find $HOME -type f -printf ‘%s %p\n’ | sort -nr | head -10

当前目录下的文件/文件夹大小排序:

du -hs * | sort -n -r

查看inode大小:

find . -xdev -type f | cut -d “/” -f 2 | sort | uniq -c | sort -n

3. 后台运行一个任务

nohup 命令 >/dev/null 2>&1 &

将正常输出和错误重定向到/dev/null

当然,Linux后台执行一个任务还有多种方式,例如screen和tmux命令,还有其它进程管理器,如supervisor和monit,nodejs世界里有pm2。

采用screen命令后台执行一个任务,执行完后脱离会话(detach session):

screen -S $session_name -dm <your_script>

4. 进程查看

显示进程完整的命令语句,尤其对查看Java进程有用:

ps auxwww | grep java

按内存使用率查看:

ps aux | sort -nk 4

按CPU使用率查看:

ps aux | sort -nk 3

获取占用CPU资源最多的10个进程:

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

获取占用内存资源最多的10个进程:

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

查看指定进程的资源消耗:

top -p 要查看的pid

5. 递归搜索和替换

在当前目录下递归搜索所有包含__call__的python文件:
可以用下面三个命令之一:

find . -name "*.py" | xargs grep "__call__"
rgrep __call__ *.py *.js
find . -name  '*.py' -exec grep '__call__'  {}  \;

如果要做替换,可以:

grep -rl 查找字段 路径|xargs sed -i “s/查找字段/替换字段/g”
sed -i “s/garden/myGarden/g” ls
find . -type f -name ‘*.html’ | xargs perl -pi -e ‘s|北京|上海|g’

删除无用的docker镜像:

docker rmi $(docker images | grep “^” | awk ‘{print $3}’)

6. 查看哪些端口在监听

查看某个进程监听的端口号:

netstat -lnp | grep xxx
或者 netstat -tunlp

查看某个端口号谁在监听, 例如查看监听8080的进程

lsof -i:8080

7. 身份切换

sudo -i bash //切换到root
sudo bash -c bash //切换到root
sudo su admin # 切换为admin身份
sudo -u admin kill -9 xxx # 以admin身份执行kill命令

前两条命令在docker容器环境下很实用,经常不为人知。

8. 杀进程

kill $(pgrep 进程名)
另:
killall -9 webstorm

杀掉所有webstorm进程

杀掉占用端口8888的进程

kill -9 $(lsof -i:8888 -t)

9. 万能的curl

采用curl命令可以发送各种HTTP请求,程序员必备技能。curl发送post请求:

curl -H “Content-Type: application/json” -d @/data/my.json http://localhost:8080/api/service/registry/add

如果不指定content-type, 默认是:application/x-www-form-urlencoded

下载github文件:

curl -LJO https://github.com/garychowcmu/daizhigev20/archive/refs/heads/master.zip

10. 一行for语句遍历

可以直接在命令行写一行for语句,无需写到脚本。

for p in ls /home/mini-rds/mysql/; do echo KaTeX parse error: Expected 'EOF', got '&' at position 3: p &̲& mysql -h127.0…p -uroot -e ‘show slave status\G’ | grep ‘Master_Host’; done

一行语句查找满足条件的某个docker容器:

for conId in $(docker ps -q|grep Up);do docker inspect c o n I d ∣ g r e p 170.1.80.12 ; i f [ " conId | grep 170.1.80.12 ;if [ " conIdgrep170.1.80.12;if["?" -eq “0” ];then echo $conId; fi; done

总结

本文通过实际例子展示了Linux基本命令的用法。要想熟练使用Linux,掌握下列命令是必不可少的。

  • 包管理: apt/dpkg, yum/rpm
  • 搜索: find和grep
  • 文件处理: cat, more, less
  • 进程:ps, top, htop
  • 网络: netstat, lsof, ip, ifconfig, curl
  • xargs: 构建一条可执行命令,将标准输入作为待构建命令的参数
  • 文本处理:sed、awk、cut
  • 基本的shell语法: for, if
  • 注意shell中几个特殊字符的作用: 单引号和双引号都将剥夺其中的所有字符的特殊含义,而双引号中的’$‘(参数替换)和’`'(命令替换)是例外,而反引号和$()将执行里面的命令,以返回结果替换所在的字符串的相应部分

Shell之核心语法while/if/until速记

while [ 1 ]; do sleep 1; ll; done # 无限循环
while [ $i -lt 10 ]; do echo $i;let "i=$i+1"; done # 有限循环
cat raw.txt | while read line; do echo $line; done # readline
until [ 1 = 0 ]; do sleep 1; ll; done # 无限循环,另一中语义
for i in /media/m* ; do ls -l $i; done  # 与目录资源结合
if [ 1 -eq 1 ]; then ll ;fi # test常用判断
if [[ 0 -eq 0 && 1 -eq 0 ]]; then ll ;fi  ## || or 多条件test的写法1 && and (注意2层中括号)
if [ 0 -eq 0 -a 1 -eq 0 ]; then ll ;fi    ## -o or 多条件test的写法2 -a and
if [ ! -e /tmp/111 -a -z "$a" ]; then ll ;fi   ## 不存在111文件 且a变量长度为0 则执行ll(对应的否定是)

awk/sed/cut用例速记

ps -ef | grep java | grep -v eclipse # 查看进程,筛选出java的,排除eclipse的
echo helloworld | tr -d "o"  # 删除字符o,输出 hellwrld
echo 'a:b:c' | tr -s ':' '*'  # 替换字符:为*,输出 a*b*c
echo 'a:b:c' | awk -F ':' '{print $1 "+" $3 "+" $2}' # 按:切分后,按下标调整顺序,空格分割输出。a+c+b
awk -F':' '{print $1}' temp2.log | awk '{ arr[$1]++ } END { for( no in arr) { print no , arr[no] } }' | sort -n -t" " -k 2 -r # 一句话实现group by,这条不细说,自己研究
echo 'a:b:c' | sed -e 's#:#*#g'  # 替换字符:为*,输出 a*b*c

再补充一些其它例子

本文浏览量比较高,说明Linux实用命令对大家帮助还是挺大的,继续补充:

11、统计字符出现次数

#如下输出统计所有数字出现次数
#grep -E 表示用正则匹配,-o 表示只输出匹配部分
#END表示最终执行代码块
find -name *.txt | xargs grep -E -o “[0-9]+” | awk ‘{count++} END{print count}’

12、统计代码行数

awk ‘{if(N /.+ N / . + /) count++} END{print count}’ ./demo.txt

N为当前行字符,正则/.+ N 为 当 前 行 字 符 , 正 则 / . + /表示该行中有任意字符则count++

13、统计文件个数

Linux下有三个命令:ls、grep、wc。通过这三个命令的组合可以统计目录下文件及文件夹的个数。

统计当前目录下文件的个数(不包括目录)
$ ls -l | grep “^-” | wc -l
统计当前目录下文件的个数(包括子目录)
$ ls -lR| grep “^-” | wc -l
查看某目录下文件夹(目录)的个数(包括子目录)
$ ls -lR | grep “^d” | wc -l

命令解析:

ls -l
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR是列出所有文件,包括子目录。

grep “^-”
过滤ls的输出信息,只保留一般文件,只保留目录是grep “^d”。

wc -l
统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数。

14、文件传输

ssh -p 1022 root@192.168.1.200  # 从1022端口,以root身份登录到远程
scp -P 1022 openwrt-*  root@192.168.1.200:/tmp/  # 通过1022端口,把openwrt开头的多个文件,传输到远程机器上的tmp目录,以root做为鉴权
rsync -avz -e 'ssh -p 1022' openwrt-* root@192.168.1.200:/tmp/ # 效果基本同上,但是只是增量同步
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极象

如果觉得对您有帮助,鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值