linux常用命令行
Easul Lv6

这里主要是linux常用命令的参考
命令行中常用的代码片可以参考
shell脚本中的常用命令片段可以参考

常用命令合集

菜鸟教程

进程

ps

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 命令中一些参数的解释
#
# a: 显示当前终端下的所有进程,包括其他用户的进程
# u: 以用户为主的格式来显示程序状况
# x: 显示当前用户所有终端下的进程信息
# -e: 显示系统内的所有进程信息
# -l: 使用长(long)格式显示进程信息
# -f: 使用完整的(Full)格式显示进程信息
#
############################################
# 显示列表的一些参数列标题的解释
#
# USER 启动该进程的用户帐号名称
# PID 程序ID
# %CPU 占CPU百分比
# %MEM 占内存百分比
# VSZ 占虚拟内存(swap)大小
# RSS 占物理内存大小
# TTY 进程在哪个终端运行
# STAT 进程状态:S(休眠) R(运行) Z(僵死) < (高级先级) N(低优先级),S(父进程),+(前台进程)
# START 启动的开始时间
# TIME 启动所用时间
# COMMAND 启动命令

# 查看当前运行进程
ps aux
# 查看详细命令
ps -auxwww
# 可以包含更多的信息
ps -elf
# 只查看某个进程的信息
ps -elf | grep bash
# 查看某进程详细信息
ps pid
# 获取某个运行进程的个数
ps -ef|grep bash |grep -v "grep"|wc -l

参考

top

用于动态查看进程信息

BASH
1
top

watch

用于实时监测一个命令的运行结果

BASH
1
2
# 每隔5秒高亮查看时间变化
watch -n 5 -d date

参考

kill

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
# -1: 该信号通常用于重新读取配置文件或重新初始化某些资源。
# 当使用该信号时,进程将会重新启动,并重新读取其配置文件,重新初始化其资源等。
# -2: 该信号通常由用户输入 Ctrl+C 产生。
# 当使用该信号时,进程将会被中断,但不会立即终止
# 可以用来向进程发送中断信号,以便让进程安全地退出。
# -5:该信号通常用来向进程发送终止信号,以便让进程安全地退出。
# 当使用该信号时,进程将会被中断,并有一定的时间来清理其资源和保存状态。
# -9: 该信号被称为强制终止信号,可以用来强制终止进程。
# 当使用该信号时,进程将会立即终止,并且无法处理该信号。
# 与 SIGTERM 不同,进程无法捕获和处理 SIGKILL 信号
# 因此该信号通常用于强制终止不响应其他信号的进程。
# 可能会导致正在运行的进程无法正确地清理其资源和保存状态
kill -n pid

文件查看

more

BASH
1
2
3
4
# 一页一页查看文档
# space到下一页
# b回到上一页
more readme.md

less

YAML
1
2
3
4
5
6
# 浏览文本文件
G: 移动到最后一行
g: 移动到开头一行
/字符串: 查找字符串并高亮
ESC+u: 取消高亮
q: 退出less

cat

BASH
1
2
3
4
5
6
7
8
9
10
# 用于叠加两个文件
cat 1.jpg 2.jpg > 3.jpg
# 导入输入流
# 如果直接使用 EOF,那么文本中有$var之类的变量会被解析
# 如果使用-'EOF',那么文本中的$var之类的变量就会直接当做字符串写入文本
cat > 1.txt <<EOF
asdfasdf
asdfasd
asdf
EOF

tail

BASH
1
2
3
4
5
6
# 查看最后 10 行日志
tail -10 a.log
# 实时查看日志
tail -f a.log
# 实时查看最后 10 行日志
tail -10f a.log

字符串操作

jq

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -r 输出原始字符串,而不是JSON文本,可以去掉值中的双引号 
# 用于输出json
echo '{ "foo": { "bar": { "baz": 123 } } }' | jq '.'
# 获取键的值
echo '{ "foo": { "bar": { "baz": 123 } } }' | jq '.foo.bar.baz'
# 获取带数组的键
echo '{ "foo": [{ "bar": { "baz": 123 } }, { "bar2": { "baa": 123 } }] }' | jq '.["foo"][0]'
# 修改某个键的值
url="test"
echo '{ "foo": [{ "bar": { "baz": 123 } }, { "bar2": { "baa": 123 } }] }' | jq '.["foo"][2]'='{ "title": "hello", "url": "'$url'" }'
# 删除某个键
echo '{ "foo": [{ "bar": { "baz": 123 } }, { "bar2": { "baa": 123 } }] }' | jq 'del(.["foo"][0])'
# 将json压缩为一行,这里是从文件读取数据,也可以从标准输入读取
jq -c -r '.' input.json > output.json

参考
jq手册

awk

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 参考文档:https://shell.212490197.xyz/c/awk.html
# -F "," 用,分割字符串
# 相当于命令行的编程
# 大括号{}相当于一个循环体,每次处理一行数据
# 内置变量
# $NF 打印每行最后一个字段
# $(NF-1) 打印每行倒数第二个字段
# NR 获取行号
# $0 获取当前行内容
# 内置函数
# length 获取数组长度
# 内置正则函数
# gsub 字符串替换
# match 用于进行匹配判断,返回真假
# split 用于字符串分割,返回数组
# 这里展示了所有tcp和udp连接,并且包括进程ID与进程名,然后找带7770的行,获取每行的最后一个字段和行号,然后输出这个字段
netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}'
# awk列出了一个空格组成的字符串,然后用()将字符串括起来,就成了一个数组
result=($(ls -l | grep "easul" | awk '{print $9}' | awk -F['@'] '{print $1}'))
echo ${result[0]}
# 用,分割字符串
echo "[[176120,180000,1681796460510]]" | awk -F "," '{print $1}'
# 对输入的数据用 , 分割,然后跳过第一行标题行,并获取 每行分割的数据 的 第一个 和 第三个
# 然后去除 开头或结尾 的 ",然后输出
# 但这里 awk 会将所有数据处理完,放到内存,后续的 while read 才能后处理
# 数据较大的时候,可能会占用很多内存
awk -F, 'NR>1{
gsub(/^"|"$/, "", $1);
gsub(/^"|"$/, "", $3);
imageId = $1;
imageUrl = $2;
videoId = $3;

print imageId, imageUrl, videoId;
}' "./test.log" | while read imageId, imageUrl, videoId
do
echo "$imageId, $imageUrl, $videoId"
done

sed

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 参考文档: https://shell.212490197.xyz/c/sed.html
# -r 使用正则,且只能用贪婪匹配
# s 进行字符替换
# g 全行替换
# ; 可以组合多个表达式,如's/\./s/g;s/\t/m/g'
sed -r 's:.*tag/(.*?)" data-view-component="true".*:\1:g'
# -i 对文件进行直接操作
# i\ 在该行上边插入文本,多行可以用\隔开,会保留原本的空格占位符
sed -i '/ <id>maven-default-http-blocker<\/id>/i\
<id>alimaven</id> \
<mirrorOf>central</mirrorOf> \
<name>aliyun maven</name> \
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url> \
</mirror> \
<mirror> \
<id>nexus-aliyun</id> \
<mirrorOf>*</mirrorOf> \
<name>Nexus aliyun</name> \
<url>http://maven.aliyun.com/nexus/content/groups/public</url> \
</mirror> \
<mirror>' ./maven/conf/settings.xml

cut

BASH
1
2
3
4
5
6
7
8
# 用于获取每行指定位置的数据
# -d 指定分隔符
# -c 指定获取哪几个字符
# -f 指定获取哪些字段
# 获取1-3位置的字符
cut -c1-3 test.txt
# 获取第2个字段
ls -l | cut -d " " -f2

tr

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
# 将字符进行替换和删除
# 参考:https://shell.212490197.xyz/c/tr
# -c 取代所有不属于第一字符集的字符;
# -d 删除所有属于第一字符集的字符;
# -s 把连续重复的字符以单独一个字符表示;
# -t 先删除第一字符集较第二字符集多出的字符。
# 删除\n
tr -d '\n'
# 将空格转换为%
tr ' ' %
# 将连续空格,s,n替换为单个字符
# this is a text line.
echo "thissss is a text linnnnnnne." | tr -s ' sn'

wc

BASH
1
2
3
4
5
# wordcount.用于字符个数的计数
# -l 获取当前多少行
# -m 获取当前多少个字符
# 获取当前目录多少个文件
ls -l | grep "^-" | wc -l

grep

BASH
1
2
3
4
5
6
7
8
9
10
11
# 挑出符合需求的字符串,可用正则
# -m 指定查找到几行就停止
# -q 不显示输出
# -P 使用Perl格式的正则
# -v 选中不匹配的行
# -E 使用扩展正则,某些字符串中的正则特殊符号就有了正则的含义,否则只是原样匹配
# -o 输出匹配
# -w 使用单词边界进行匹配
echo "asdf"| grep 'a' -m 1
# 输出grep返回的错误码
echo "google " | grep -q "google" ; echo $?

printf

用于格式化字符串

BASH
1
2
3
4
5
6
# 将i格式化为5位整数,前边不足补0
i=1
printf "%05d" $i

# 直接引入变量
printf "$test [hello]${test2}${test3}"

文件写入

tee

BASH
1
2
3
4
5
6
7
8
# 从标准输入读取数据并重定向到标准输出和文件
# 如果直接使用 EOF,那么文本中有$var之类的变量会被解析
# 如果使用-'EOF',那么文本中的$var之类的变量就会直接当做字符串写入文本
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.xxx.xxx.xxx"]
}
EOF

echo

BASH
1
2
3
4
5
6
7
8
# 这样会原样覆盖源文件
echo "test
test
test" > test.txt
# 文件追加
echo "test
test
test" >> test.txt

echoprintf的区别

  1. 前者自带回车,后者原样输出

nohup

用于生成日志命令

BASH
1
2
3
4
5
# 这里的日期在输出命令行时将自定变为固定值
nohup ./bin/code-server > ./logs/`date +%Y-%m-%d`.log 2>&1 &
# 如果要将命令写入脚本可以如下
echo "nohup ./bin/code-server > ./logs/\$(date +%Y-%m-%d).log 2>&1 &" > runcmd
echo "nohup ./bin/code-server > ./logs/\`date +%Y-%m-%d\`.log 2>&1 &" > runcmd

文件与目录

dirname

BASH
1
2
# 用于获取该文件所在的目录
dirname $0

pwd

BASH
1
2
# 用于列出当前脚本所在路径的字面量
pwd

file

用于查看文件类型

BASH
1
2
# 显示字符集还有文件类型
file test.txt

which

用于找某个可执行文件的路径,只在环境变量中找

BASH
1
which mysql

whereis

用于查找二进制文件、源代码文件和man手册页面的路径,它会在预定义的一些目录中查找命令

BASH
1
whereis mysql

find

BASH
1
2
3
# 参考文档:https://shell.212490197.xyz/c/find.html
# 用正则找到当前目录下的txt或pdf结尾的文件
find . -regex ".*\(\.txt\|\.pdf\)$"

文件容量

du

BASH
1
2
3
4
5
6
7
8
9
# 查看文件夹内所有文件大小
# -a:=all,显示全部文件与目录的大小
# -b:以byte(B)为单位显示内容
# -k:以KB为单位显示内容
# -m:以MB为单位显示内容
# -h:系统自动调节单位显示内容
# -c:最后加总
# -s:只列出总和
du -s home/

参考

df

查看所有磁盘的使用情况

BASH
1
2
# -h: 使用适合的单位描述
df -h

参考

解压

zip

BASH
1
2
# -d 解压路径
unzip -d ./mydir/ myfile.zip

tar

BASH
1
2
3
4
5
6
# 解压
tar -zxvf file.tar.gz
# -C 解压到某路径,路径需存在
tar -zxvf file.tar.gz -C ./test
# 压缩
tar -zcvf file.tar.tz ./fileFolder/

xz

BASH
1
2
3
# 解压
xz -d node.tar.xz
tar -xvf node.tar -C ..

编码

base64

BASH
1
2
3
4
5
6
7
# -w 设置为0,则base64编码后的数据放到一行,否则每76个字符会换行
# -d 解码数据
# -i 解码时忽略非字母字符
# 编码
base64 -w 1.jpg
# 解码
echo $base64Str | base64 -i -d

系统

crontab

BASH
1
2
3
4
5
6
# 列出定时处理的内容
crontab -l
# 导入crontab
crontab -u easul ./deepin/crontab/crontab
# 编辑crontab
crontab -e

systemctl

BASH
1
2
3
4
5
6
7
8
9
10
11
12
# 启动某服务
systemctl start xxx.service
# 重启某服务
systemctl restart xxx.service
# 停止某服务
systemctl stop xxx.service
# 某服务开机自启动
systemctl enable xxx.service
# 关闭某服务开机自启动
systemctl disable xxx.service
# 重启 systemctl 服务
systemctl daemon-reload

如果需要创建自启动的服务,可以参考这篇文章创建xx.service

date

BASH
1
2
# 将unix时间格式化为指定年月日时分秒
date -d @1633017937 "+%Y-%m-%d %H:%M:%S"

网络

wget

BASH
1
2
3
4
5
6
# -P 指定下载文件夹,没有会自动创建
# -O 指定文件下载到该文件中,如果需要下载到某文件夹需要加上上边-P的路径,设置为-O-表示输出到标准输出
# -N 只获取比本地文件新的文件
# --no-check-certificate 不检查证书
wget -O file.tar.gz https://test.com/test-v1.1.tar.gz
wget -P ./test -O ./test/test.tar.gz file.tar.gz https://test.com/test-v1.1.tar.gz

curl

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# curl官方文档: https://curl.se/docs/manpage.html
# -X 请求方法
# -H 请求头
# -o 指定要写出的文件
# -f http错误时不再静默输出
# -s 静默模式
# -S 使用了静默模式后显示错误
# -L 跟随跳转
# --url 请求的url
# -d 指定name=Bob这种的数据
# --data-raw 请求的数据
# --data-urlencode 对数据进行url编码
# --connect-timeout 超时
# -F 用于上传form表单的数据,传输表单时如果要传文件可以用@,但如果只需要获取文件中的内容就用<
# --compressed 压缩响应,以字符串输出到控制台
# 注意变量要放到双引号内,不能放到单引号内
# 1. xhr请求
wd="hello"
curl -X GET -H "Host: www.baidu.com" --data-raw "wd=$wd" --compressed --url "https://www.baidu.com/s"
curl -X GET -H "Host: www.baidu.com" -d "wd=$wd" --compressed --url "https://www.baidu.com/s"
# 2. form请求
curl -X GET -H "Host: www.baidu.com" -F "wd=$wd" --compressed --url "https://www.baidu.com/s"
# 3. 上传文件
filePath="/home/xxx/1.png"
curl -X POST -H "Host: www.baidu.com" -F "file=@$filePath" --compressed --url "https://www.baidu.com/s"
curl -X POST -H "Host: www.baidu.com" -d "file=@$filePath" --compressed --url "https://www.baidu.com/s"
curl -X POST -H "Host: www.baidu.com" --data-urlencode 'picture='"$(base64 $filePath)"'' --compressed --url "https://www.baidu.com/s"
# @-是用于防止文件过长,所以直接从输入流读取
echo "file=$(base64 $filePath)" | curl -X POST -H "Host: www.baidu.com" -d @- --compressed --url "https://www.baidu.com/s"
# @直接发送文件
curl -X POST -H "Host: www.baidu.com" -d "asdf=@file.jpg" --compressed --url "https://www.baidu.com/s"
# <用于发送文件中的内容
curl -X POST -H "Host: www.baidu.com" -d "asdf=@file.txt" --compressed --url "https://www.baidu.com/s"

nc

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 用来在网络上读、写以及重定向数据
# 相关文档:https://shell.212490197.xyz/c/nc
# 一些其他参考:https://zhuanlan.zhihu.com/p/270185285?utm_id=0
# 端口扫描
nc -nvv 192.168.0.1 80
# 一方开启服务器,另一方可传送文件
nc -lp 8888 > recieveFile.tar.gz
nc -zv 192.168.5.4 8888 < sendFile.tar.gz
# 通过本地socks5代理重定向ssh连接
# -X 5 指定代理协议是socks5
# -x 指定代理ip:端口
# %h 要连接的主机
# %p 要连接的端口
# 安装的话可以这样
# apt install netcat-openbsd
ssh root@192.168.2.1 -o ProxyCommand="nc -X 5 -x 127.0.0.1:1080 %h %p"

命令

xargs

BASH
1
2
3
4
5
6
7
8
9
# 文档:https://shell.212490197.xyz/c/xargs.html
# 用于给其他命令传递参数
# -n 多行输出,-n3表示每行输出三个
# -d 将输入的字符串用该分隔符分割为多个参数,如-dX
# -I 指定一个替换字符串{}
# 这里找到的字段都会组成一行传给kill
cut -c 9-15|xargs kill -9
# 复制所有的图片到另一个文件夹
ls *.jpg | xargs -n1 -I{} cp {} /data/images

alias

为命令起别名

BASH
1
2
3
echo "
alias mvn='/opt/software/coding/apache-maven-3.8.4/bin/mvn'
" >> ~/.bashrc

eval

将参数看做shell命令执行,并返回结果

BASH
1
eval date

let

用于计算

BASH
1
2
3
i=1
let i=i+1
echo $i

小工具

xclip

BASH
1
2
3
4
# 将剪贴板截图输出到文件
xclip -o -sel clip -t "image/png" > test.png
# 将数据输出到剪贴板
echo "asdf" | xclip -sel clip

shuf

BASH
1
2
3
4
# 生成多个随机数,每个一行
# -i 指定随机数的范围
# -n 指定输出的行数
shuf -i 0-59 -n 10

seq

打印一个数字序列

BASH
1
2
# 打印1-4,每行一个数字
seq 5

sort

BASH
1
2
3
# 对每一行数字进行排序
# -n 进行数字排序
shuf -i 0-59 -n 10 | sort -n

screen

用于后台运行命令行

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 创建会话
screen -S mysession
# 列出所有会话
screen -ls
# 重新连接会话
screen -r mysession
# screen内部挂起会话
# CTRL + A 再按 D
# screen内部退出会话,以下两种都可以
# CTRL + D
exit
# 强制接管会话
# -d 断开旧连接
# -r 重新连接
screen -dr mysession

# screen内命令
#
# 滚屏
# CTRL + A ESC
# 创建新窗口
# Ctrl + A C
# 上一个窗口
# Ctrl + A P
# 下一个窗口
# Ctrl + A N
# 查看窗口列表
# Ctrl + A "
# 切换到不同窗口
# Ctrl + A 0
# Ctrl + A 1
# 重命名窗口
# Ctrl + A A
# 查看帮助
# Ctrl + A ?
# 所有的退出都可以使用 ESC 或 q

tmux

更强大的后台运行命令行

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 创建会话
tmux new -s mysession
# 列出所有会话
tmux ls
# 重新连接会话,两个ssh可以同时连接来共享会话
tmux attach -t mysession
# screen内部挂起会话
# CTRL + B 再按 D
# screen内部退出会话,以下两种都可以
# CTRL + D
exit
# 强制接管会话
# -d 断开旧连接
tmux attach -d -t mysession

# screen内命令
#
# 滚屏
# Ctrl + B [
# 创建新窗口
# Ctrl + B C
# 上一个窗口
# Ctrl + B P
# 下一个窗口
# Ctrl + B N
# 查看窗口列表
# Ctrl + B W
# 切换到不同窗口
# Ctrl + B 0
# Ctrl + B 1
#
# 分屏
# 水平分屏
# Ctrl + B "
# 垂直分屏
# Ctrl + B %
# 分屏切换
# Ctrl + B 方向键
# 所有的退出都可以使用 ESC 或 q

我觉得底下颜色条的颜色不太好看,可以通过如下方式来改

BASH
1
2
3
4
5
6
7
8
# 以下设置在debian中尝试
# 设置了背景色和字体颜色
cat >> ~/.tmux.conf <<EOF
set -g status-bg "#8CA747"
set -g status-fg black
EOF
# 刷新配置
tmux source-file ~/.tmux.conf
 评论