Linux开发人员常用命令

常用查询命令

# 查看ip地址
ip addr show

# 查看当前目录路径
pwd

# 当前目录下模糊查找文件
find / -name "*.pdf"

查看运行中进程

ps -ef | grep test

ps aux | grep test

# 查询包含java字符的记录,且过滤掉包含grep字符的记录,查询行数(wc -l)
ps -ef | grep java | grep -v grep | wc -l

# 过滤掉包含root字符的记录
grep -v root

# jps是jdk提供的查看java进程的小工具
jps

# 遍历正在运行的进程pid
pidof java
pgrep java

查看端口使用情况

# Windows
netstat -qo
# 查看端口占用情况
netstat -ano |findstr "端口号"
# Linux
ss -tnlp
ss -tnlp | grep 160 # 匹配包含160的信息
# 查看端口占用情况
ss -tnlp|grep 端口号 | sort -k 4

查看磁盘空间

# 检查系统中文件的使用情况
df -h -T

# 查看当前目录下各个文件及目录占用空间大小
du -sh *

# 查看指定文件大小
du -h test.txt

# 查看资源使用情况
top -c

# 查看内存占用情况
ps auxw --sort=-rss

# CPU 占用率 100% 排查五步法
1. top # 找到最耗CPU的进程 pid
2. top -Hp [pid] # 定位应用进程对应的线程 tid
3. printf"%xln"[tid] # 将 tid 转换为十六进制
4. jstack [pid] | grep -A 10 [tid 的十六进制] # 打印堆栈信息
5. 根据堆栈信息分析问题

查看主机名

hostname
hostnamectl
uname -a | awk '{print $2}'

# 查看发行版信息
cat /etc/os-release

查看历史命令

history 10  # 列出最近的10条命令
history -c  # 清除历史命令
history|grep ls  # 模糊搜索历史命令

测试IP端口是否连通

# 方式一:
telnet ip port
# 方式二:
curl ip:port
# 方式三:
wget ip:port
# 方式四:
ssh -v -p port username@ip

# 跳转进入指定服务器
ssh ip地址
# 复制文件到指定服务器目录
scp test.txt root@ip地址:/home/data

控制命令

Ctrl + L # 清屏(或clear)
Ctrl + C # 终止命令
Ctrl + S # 阻止屏幕输出
Ctrl + Q # 允许屏幕输出
Tab      # 补全命令

基本操作

cd -  # 返回上次的工作目录
cd ~  # 进入当前用户
cd /  # 进入根目录

./    # 指在当前目录
../   # 指返回上一级目录

# 复制
cp    # 只能移动文件
cp -r # 包括文件夹一块移动

# 重命名
mv ex3 new1 # 将文件ex3改名为new1

# 移动
mv /lianxi/kkk/* /lianxi/jjjj/  # 移动文件
mv * ../                        # 移动当前目录所有文件到上级目录

# 以时间戳方式备份文件夹,先修改文件夹名称,再把文件夹移动到当前目录的bak目录中
mv file01 file01_bak_"$(date +%Y%m%d%H%M%S)" && mv file01_bak_* ./bak

# 删除
rm *   # 删除当前目录下所有文件
rm -r  # 可以删除文件夹
rm -rf # 强制删除

# 删除文件但排除个别文件
shopt -s extglob             # 打开extglob模式
rm -fr !(file1)              # 排除一个
rm -rf !(file1|file2|file3)  # 排除多个
shopt -u extglob             # 关闭extglob模式

# 批量移动
find test/ -name "*.jpg" -exec cp {} train \;

# 批量删除
find test/ -name "*.jpg" | xargs -i rm {}

# 新建文件夹
mkdir file_2022 #新建文件夹
rmdir file_2022 #删除文件夹
mkdir -p test1/test2/test3  #递归新建多层目录

# 新建文件
touch filename.txt

根据时间删除文件或者目录

命令 说明
-mtime +3 按照天数 +3 指查找3天前的文件,-3指查询3天内的文件
-mmin +30 按照分钟 +30指查找三十分钟前的文件,同上
-name ".csv" ".csv"表示查找扩展名为csv的所有文件,""表示查找所有文件
-exec 固定写法
rm -rf 强制递归删除,包括文件和目录
{} \; 固定写法
find 对应的目录 -mtime +3 -name "文件名" -exec rm -rf {} \;
find 对应的目录 -mmin +30 -name "文件名" -exec rm -rf {} \;

find ./ -mtime +2 -exec rm -rf {} \;
find /data/www/ -mtime +2 -exec rm -rf {} \;
find /data/www/ -mtime +3  -name "*.csv" -exec rm -rf {} \;
------------------------------------------------------------------------
# 删除7天前修改的文件
find /path/to/directory -type f -mtime +7 -delete
# 删除30天前创建的文件
find /path/to/directory -type f -ctime +30 -delete
# 删除所有超过一年未被访问的文件
find /path/to/directory -type f -atime +365 -delete

显示目录

ls     # 显示目录
ls -a  # 显示隐藏
ls -l  # 单列格式输出详细信息,简写:ll
tree   # 树形结构显示目录,需要安装tree包

# 时间倒序
ll -t
# 时间正序
ll -t | tac
# 时间倒序 只展示前5个
ll -t | head -n 5

一次性执行多条命令

1、使用 “;” 符号运行多条指令

$ cmd1 ; cmd2 ; cmd3
# 就算有指令执行失败也会继续执行后面的指令。

2、使用 “&&” 符号运行多条指令

$ cmd1 && cmd2 && cmd3
# 前一条指令执行失败,则后面的指令都不会执行。

3、使用 “||” 符号运行多条指令

$ cmd1 || cmd2 || cmd3
# 前一条指令执行成功,则后面的指令都不会执行。

压缩/解压

tar在Linux上是常用的打包、压缩、加压缩工具。

[参数]:
-c : # create 建立压缩档案的参数;
-x : # 解压缩压缩档案的参数;
-z : # 是否需要用gzip压缩,--gzip, --gunzip, --ungzip   通过 gzip 过滤归档
-v : # 压缩的过程中显示档案;
-f : # 置顶文档名,在f后面立即接文件名,不能再加参数
-J : # --xz 通过 xz 过滤归档
-C :  # --directory=DIR 改变至目录 DIR

# 1、gzip格式:
tar -zcvf test.tar.gz file1 file2     # 压缩(一般压缩包包名以 .tar.gz作为后缀名)

tar -zxvf test.tar.gz                 # 解压到当前目录
tar -zxvf test.tar.gz -C /home/file   # 解压到指定目录

# 2、bz2格式:
tar jcvf test.tar.bz2 file1 file2     # 压缩(一般压缩包包名以 .tar.bz2作为后缀名)

tar -jxvf test.tar.bz2                # 解压到当前目录
tar -jxvf test.tar.bz2 -C /home/file  # 解压到指定目录

开机自启动

/etc/rc.d/init.d/     # 存放着自启动脚本,优先级比下面的高
/lib/systemd/system/  # 存放着自启动脚本
/etc/rc.local         # 直接加入即可

# 设置脚本的可执行权限
chmod +x /etc/init.d/xxxx.sh

JPS命令及参数介绍

jps [options ] [ hostid ]  # 其中[options]和[hostid]都是可选参数
# 查询Linux系统当前所有java进程pid的命令,jps是jdk提供的一个查看当前java进程的小工具。
[options]选项:
-q # 仅输出VM标识符,不包括classname,jar name,arguments in main method
-m # 输出main method的参数
-l # 输出完全的包名,应用主类名,jar的完全路径名
-v # 输出jvm参数
-V # 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
-Joption # 传递参数到vm,例如:-J-Xms512m

[hostid]参数:[protocol:][[//]hostname][:port][/servername]
1)jps
2)jps –l # 输出主类或者jar的完全路径名
3)jps –v # 输出jvm启动参数
4)jps –q # 仅仅显示java进程号
5) jps -mlv 192.168.2.11

vi编辑文件内容

# 编辑模式:使用vi进入文本后,按i开始编辑文本
vi /etc/hosts
# 退出编辑:按ESC键
# 然后输入:
:q!  # 不保存文件,强制退出vi命令
:w   # 保存文件,不退出vi命令
:wq  # 保存文件,退出vi命令

# vi编辑器只能运行于unix中,而vim不仅可以运行于unix,还可用于windows、mac等多操作平台。

# 因为Linux无法识别Windows的DOS格式,此时需要将文件格式转换成unix即可。
:set ff #(查看文件格式)
:set ff = unix # (修改格式)

# 编辑状态显示行数
:set number #(显示)
:set nonumber #(关闭)

# 删除单行
dd #(删除光标定位行)

# 删除多行
:10,20d #(删除行号10-20行)

查看vi和vim的区别

查看文件内容

cat /etc/hosts        # 查看文件内容的全部
tail/head             # 查看指定的行
tail /etc/hosts       # 显示文件最后10行
tail -n 2 /etc/hosts  # 显示文件最后两行,同-2
head /etc/hosts       # 显示文件前10行
head -2 /etc/hosts    # 显示文件前2行,同-n 2

wc /etc/hsots         # 统计文本中行数、字数、字符数

查看日志内容

tail -f temp.log      # 不断刷新读取新内容

tail web.2016-06-06.log -n 300 -f         # 查看底部即最新300条日志记录,并实时刷新

grep 'nick' -C 10 | tail run.log -n 1000  # 从最近1000行日志内查找,匹配字符‘nick’前后10条日志记录
grep 'nick' -C 10 run.log | head -n 1000  # 效果同上

cat -n test.log |grep "地形" |more        # more 分页查询

grep常见用法

grep 'nick' -C 10 run.log  # 查询字符‘nick’前后10条日志记录, 前10行(-A 10),后10行(-B 10)
grep -n "root" /etc/passwd # 过滤出来加行数
grep -c "root" /etc/passwd # 过滤出来的行号
grep -v "root" /etc/passwd # 取反
grep -q "root" /etc/passwd # 过滤出来的不显示
grep -w "root" /etc/passwd # 过滤出来有单词root的行
grep -o "root" /etc/passwd # 过滤出来root单词
grep -ro "root" 目录       # 过滤出来目录中文件里的有root的行
grep -i "root" /etc/passwd # 忽略大小写
grep -E "root" /etc/passwd # 启用扩展正则
grep -f file file1    # 过滤出file和file1中共同拥有的行
grep -f file file1 -v # 过滤出file有file1没有的行
grep -x "root" file   # 过滤file中只含有root的的行

文件搜索

whereis           # 搜索系统命令所在的位置,不能查询文件
whereis hadoop    # 搜索程序名称
whereis -b hadoop # 搜索可执行的文件
whereis -m hadoop # 搜索说明文件
whereis -s hadoop # 搜索源代码

which             # 能搜索命令所在位置,以及如果有些命令有别名,则会查出别名
which python

find .                        # 列出当前目录及子目录下所有文件和文件夹
find . -name test.txt         # 按特定名称搜索文件
find / -name "*.pdf"          # 在根目录下搜索后缀为.pdf的文件
find / -type f -name "*.pdf"  # 指定(-type f)搜索会使所有内容更清晰
find . -type d -name "yang*"  # 查找不同类型的文件
find . -type l -name "yang*"  # 查找不同类型的文件
find . -name '.r.*' -exec rm {}   # 匹配删除文件

查看更多find的用法

sed进行数据操作

# 删除文件中第一行
sed -i '1d' file.txt

# 删除文件中最后一行
sed -i '$d' file.txt

# 删除文件中的指定一行
sed -i '3d' file.txt

# 删除第M到N行
sed -i 'M,Nd' file.txt

# 删除第M行到最后一行
sed -i 'M,$d' file.txt

# 删除文件中包含某个关键字开头的所有行
sed -i '/^keyword/d' file.txt

# 删除文件中包含某个关键字的所有行
sed -i '/keyword/d' file.txt

# 替换字符串
sed -i 's/abc/ABC/' file.txt # 替换file.txt每一行的第一个abc为ABC
sed -i 's/abc/ABC/g' file.txt # 使用后缀g,替换file.txt每一行的所有abc为ABC

# 追加字符串
sed -i 's/^/ABC/' file.txt # 在file.txt每一行的行首追加字符串ABC
sed -i 's/$/ABC/' file.txt # 在file.txt每一行的行尾追加字符串ABC

# 追加或插入一行
sed -i 'Na hello_world' file.txt # 在file.txt第N行后面追加一行"hello_world",a表示追加
sed -i 'Ni hello_world' file.txt # 在file.txt第N行前面插入一行"hello_world",i表示插入
sed -i '/hello/a hello_world' file.txt # 在file.txt包含"hello"的所有行后面追加一行"hello_world"

字符串的提取和替换

判断读取字符串值

表达式 含义
${var} 读取变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

操作字符串(长度/截取/替换/删除)

表达式 含义
${#string} 读取$string的长度
${string:position} 在$string中, 从位置$position开始提取子串
${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

echo进行数据操作

# 在终端打印输出
echo "hello world"

# 向文件中写入内容
echo "hello world" > test.txt    # 原先的内容会被覆盖掉

# 向文件中追加内容
echo "add content" >> test.txt

# 执行脚本同时追加多行文本命令
CMD echo "192.168.1.1 test1.com.cn" >> /etc/hosts;\
echo "192.168.1.2 test2.com.cn" >> /etc/hosts;\
echo "192.168.1.3 test3.com.cn" >> /etc/hosts;\
echo "192.168.1.4 test4.com.cn" >> /etc/hosts;\
java -jar -Dfile.encoding=utf-8 /java/test.jar --spring.profiles.active=test

echo输出时的转义字符

echo [-neE] [arg …]
-n: # 表示输出字符串不换行
-e: # 表示对于转义字符按对应的方式进行处理(若不加-e ,那么在输出时转义字符会按照普通字符进行处理,并不会达到自己想要达到的目的。)
-E: # 禁用转义解释

\b # 表示删除前一个字符
\e # 表示删除后一个字符
\n # 表示换行
\t # 表示水平制表符
\v # 表示垂直制表符
\c # \c后面的字符将不会输出,同时,输出完成后也不会换行
\r # 输出回车符(但是你会发现\r前面的字符没有了)
\a # 表示输出一个警告声音

chmod -R 777 授权命令

chmod :# 是改变权限的命令(change mode)
-R :# 当前目录及目录下所有文件
777 :# 可读、可写、可执行
# 整个命令的作用是:对当前目录及目录下所有的文件赋予可读可写可执行权限

# 命令格式:
chmod [-cfvR] [--help] [--version] mode file
# 命令参数:
-c #当发生改变时,报告处理信息
-f #错误信息不输出
-R #处理指定目录以及其子目录下的所有文件
-v #运行时显示详细处理信息

# 权限范围:
u #目录或者文件的当前的用户
g #目录或者文件的当前的群组
o #除了目录或者文件的当前用户或群组之外的用户或者群组
a #所有的用户及群组

# 为文件f01设置自己可以执行,组员可以写入的权限
chmod u+x,g+w f01
chmod u=rwx,g=rw,o=r f01
chmod 764 f01

chmod +x f01  # 对文件f01添加执行权限
chmod -x f01  # 对文件f01删除执行权限
chmod a+x f0l # 对文件f01的u,g,o 都添加可执行权限

# 权限代号:
r #读权限,用数字4表示(Read)
w #写权限,用数字2表示(Write)
x #执行权限,用数字1表示(eXecute)
- #删除权限,用数字0表示
s #特殊权限

# 权限分为三种:读(r=4),写(w=2),执行(x=1)
可读可执行5(rx=4+1)、可读可写6(rw=4+2)、可读可写可执行7(rwx=4+2+1)。

777就是:rwxrwxrwx
755就是:rwxrxrx

755
# 第一个数字表示文件所有者的权限
# 第二个数字表示与文件所有者同属一个用户组的其他用户的权限
# 第三个数字表示其它用户组的权限。

# chmod 755 设置用户的权限为:
1.文件所有者可读可写可执行                     --7
2.与文件所有者同属一个用户组的其他用户可读可执行 --5
3.其它用户组可读可执行                         --5

IF判断比较运算符

代码示例

#!/bin/bash

num1=100
num2=100

if [ $num1 -eq $num2 ]; then
    echo "两个数相等"
else
    echo "两个数不相等"
fi

算术比较操作符

算术 运算符 代码示例
等于 -eq if [ $a -eq $b ]
不等于 -ne if [ $a -ne $b ]
大于 -gt if [ $a -gt $b ]
大于等于 -ge if [ $a -ge $b ]
小于 -lt if [ $a -lt $b ]
小于等于 -le if [ $a -le $b ]

使用算术比较操作符时,确保比较的变量值是数字。
如果需要进行复杂的数学计算,可以使用 expr 命令或者双括号 ((...)) 来执行。

逻辑运算符

逻辑 运算符 代码示例
或(or) -o if [ $a -eq 5 -o $b -eq 10 ]
与(and) -a if [ $a -eq 5 -a $b -eq 10 ]

文件比较运算符

检查文件 运算符 代码示例
检查文件是否存在 -e if [ -e $filename ]
检查文件是否存在且可读 -r if [ -r $filename ]
检查文件是否存在且可写 -w if [ -w $filename ]
检查文件是否存在且可执行 -x if [ -x $filename ]
检查文件是否存在且其大小大于零 -s if [ -s $filename ]
检查路径是否存在且为一个目录 -d if [ -d $dirname ]

字符串比较

字符串 运算符 代码示例
检查两个字符串是否相等 == if [[ $str1 == $str2 ]]
检查两个字符串是否不相等 == if [[ $str1 != $str2 ]]
检查字符串是否为空(长度为零) -z if [[ -z $str1 ]]
检查字符串是否非空(长度大于零) -n if [[ -n $str1 ]]
检查字符串是否匹配 s*a,其中 * 表示任意字符 * if [[ $str1 = s*a ]]

尽量使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。

比如 &&、||、<、> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话会报错。

比如使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

数学计算工具

注意:重定向符号(‌<、‌>、‌|)‌,通配符号(?、*):‌在某些情况下,‌这些特殊符号需要进行转义。

((...))双括号

双括号((...))主要用于算术扩展和条件表达式。这种扩展计算是整数型的计算,不支持浮点型。

# 算术运算
((1+1)) echo $?

((sum=5+8)) echo "sum is: $sum"

# 比较运算
((3 > 2)) && echo "True" || echo "False"

# 逻辑运算
((3 > 2 && 3 < 4)) && echo "True" || echo "False"

# 在if判断中使用
if (($num1 > $num2)); then echo "True"

# 在for循环中使用
for ((i=1; i<=5; i++)); do
  echo "Counter: $i"
done

# 在while循环中使用
((counter=1))
while ((counter<=5)); do
  echo "Counter: $counter"
  ((counter++))
done

expr命令

expr命令是一个用于执行基本数学运算的实用工具。它可以进行加法、减法、乘法和除法等基本操作。

运算符 代码示例
加法 expr 10 + 5
减法 expr 10 – 5
乘法 expr 10 \* 5
除法 expr 10 / 5
取余 expr 10 % 3
表达式计算 expr \(10 + 5\) \* 2

result=$(expr $a + 1)

bc命令

bc命令是一个高精度计算器,可以进行更复杂的数学计算。

运算符 代码示例
加法 echo "10 + 5" | bc
减法 echo "10 – 5" | bc
乘法 echo "10 * 5" | bc
除法 echo "scale=2; 10 / 5" | bc
平方根 echo "sqrt(25)" | bc
自然对数 echo "l(10)" | bc

等号后面的数字和运算符之间需要留有空格,而除法需要使用scale参数来指定小数位数。

awk命令

awk是一种文本处理工具,也可以用于计算。

运算符 代码示例
加法 echo “10 5” | awk ‘{print $1 + $2}’
减法 echo “10 5” | awk ‘{print $1 – $2}’
乘法 echo “10 5” | awk ‘{print $1 * $2}’
除法 echo “10 5” | awk ‘{print $1 / $2}’
平均值计算 echo “10 5 8” | awk ‘{sum=0; for(i=1; i<=NF; i++) sum+=$i; print sum/NF}'

在awk命令中,使用{}括起来的部分定义了要执行的操作。$1表示第一个字段,$2表示第二个字段,NF表示字段的总数。

expr、bc和awk命令的组合:还可以将这些命令组合在一起使用,实现更复杂的计算。

例如:可以通过将expr命令的输出传递给bc命令来进行更高级的计算。

echo "5 * 2" | expr | bc

posted @ 2021-05-07 17:19  zhαojh  阅读(67)  评论(0编辑  收藏  举报