linux 常用命令总结与shell脚本

linux 常用命令总结与shell脚本

文章目录

  • linux 常用命令总结与shell脚本
    • 前言:
    • 一、linux命令总结
          • 1、which、whereis 查找指定命令所在位置
          • 2、ls path 查看指定路径下文件列表
          • 3、pwd 返回当前所在目录, ${PWD}:当前目录
          • 4、cd 切换工作路径
          • 5、ifconfig 查看电脑ip
          • 6、poweroff、shutdown、reboot 开关机(公司中这些命令慎用,属于生产事故)
          • 7、grep 用于搜索/过滤特定字符
          • 8、| 管道符 将左边命令产生的结果 作为右边命令的输入,常常配合grep使用
          • 9、find 递归查找
          • 10、> 、>> 、2>$1 重定向
          • 11、nohup 相关cmd & 后台运行命令
          • 12、touch 、cp、mv、mkdir 文件操作相关命令
          • 13、tar、bzip2、gzip、zip压缩解压缩命令
          • 14、adduser、deluser 、passwd 用户管理(一般用不到)
          • 15、chmod 文件权限
          • 16、磁盘、端口、系统资源查看问题(free 、df、du、lsblk、lsof)
          • 17、进程管理命令(top、ps、kill、netstat)
          • 18、软件管理(rpm、yum)
          • 19、vim 文件编辑器
          • 20、cat、head、tail、more、less、sort、sed 内容查看命令
          • 21、systemctr 服务管理命令
          • 22、at、crontab 定时任务
          • 23、ssh免密登录
          • 24、date [日期]、 ln 链接、scp、rz文件传输
    • 二、shell脚本
          • 1、read 、echo 输入输出
          • 2、变量
          • 3、分支语句 if 、case
          • 4、循环语句 for、while
          • 5、函数

前言:

对于linux来说:‘一切皆文件’,命令、进程、磁盘等都是文件表示。

# Linux 顶层目录含义
/    : 根目录;
/home: 存储普通用户的用户目录
/etc : 配置文件
/bin : 可执行命令
/sbin: 系统命令
/root: 管理员用户目录
/var : 日志文件
/usr : 软件默认安装位置
/opt : 系统给用户预留目录或自定义目录

注:-h 或 --help 查看命令参数详情

一、linux命令总结

1、which、whereis 查找指定命令所在位置
#1. 查找指定命令在文件系统中的位置
>> which ls
#2. 查找指定命令在文件系统中的位置和命令的安装位置
>> whereis ls
2、ls path 查看指定路径下文件列表
>> ls -a path  # 展示所有文件包括隐藏文件
>> ls -l path  # 展示文件详情(文件权限、大小等)缩写 ll
3、pwd 返回当前所在目录, ${PWD}:当前目录
4、cd 切换工作路径
>> cd path
>> cd ~ # 返回用户家目录
>> cd - # 返回上一次所在目录
5、ifconfig 查看电脑ip
6、poweroff、shutdown、reboot 开关机(公司中这些命令慎用,属于生产事故)
>> poweroff # 关机
>> shutdown -r now/10(分钟)/20:35 # 指定时间重启系统
>> shutdown -h now/10(分钟)/20:35 # 指定时间关机
>> shutdown -c # 取消shutdowm 预定操作
>> reboot # 立即重启计算机
7、grep 用于搜索/过滤特定字符
# grep 要搜索的字符串  被搜索的文件
>> grep -i 'xxx' t.txt # 在t.txt中搜索‘xxx’忽略大小写
>> grep -i -m n 'xx' t.txt # 在t.txt中查找含‘xx’字符的前n行(-i 忽略大小写)(-m 查找的个数)
>> grep -e 'x{2}' t.txt # 在t.txt中查找含‘xx’字符的行(-e 正则表达式)

# eg: 将a文件中含有特定字符的行,放到b文件中(有面试问过)
>> grep 'xx' a > b
8、| 管道符 将左边命令产生的结果 作为右边命令的输入,常常配合grep使用
# 显示mysql数据库中test库中所有含test的表,可用于批量删除
>> mysql -uhadoop -phadoop -e'use test;show tables' | grep  'test'
9、find 递归查找
>> find /home -name '*.txt' # 查找/home 所含目录下所有txt后缀的文件
>> find / -size +512k # 全系统查找文件大小大于512k的文件
>> find / -atime -2 # 查找最后48小时访问过的文件
>> find / -mtine -1 # 查找最后24小时修改过的文件
10、> 、>> 、2>$1 重定向
# 0、1、2 在linux中分别表示标准输入、标准输出、标准错误输出;
#  1> :标准输出重定向(1可以省略 简写为 >) 
#  2> : 标准错误输出重定向 
#  2>&1 : 表示标准错误输出重定向到标准输出(必须加&,如果不加 2>1:表示标准错误输出重定向到名字为1的文件中)
# > >> : 分别表示追加或覆盖写
>> cat t.txt 1>a 2>&1 # 解读 将cat命令运行的结果输出到a 文件中(1>a:表示标准输出指向a文件 2>&1:表示错误输出重定向到标准输出,上一步标准输出已指向a,相当于此时错误输出也指向a文件)
11、nohup 相关cmd & 后台运行命令
>> nohup cat 1.txt &
12、touch 、cp、mv、mkdir 文件操作相关命令
>> touch ./a/b/t.txt # 创建文件
# cp 源文件路径  目标文件路径 (-r:可以复制文件夹)
>> cp a.txt a.txt.bak # 文件备份
# mv 源文件路径  目标文件路径
>> mv a.txt b.txt  # 文件重命名
# mkdir -p 目录/文件夹 (-p 递归创建目录)
>> mkdir -p ./a/b/c
>> rm -rf a* # 删除所在目录a开头的所有文件
13、tar、bzip2、gzip、zip压缩解压缩命令
# tar [option] 归档名 被归档的文件   (-c:创建 -v:显示过程 -f:文件)
>> tar -cvf g.tar 1 t.txt # 将1,t.txt 进行归档
>> tar -tvf g.tar    # 查看所归档文件
>> tar -xvf g.tar    # 解压归档文件

# gzip 
>> gzip g.tar (生成g.tar.gz) # 可与tar连用 tar -czvf g.tar.gz 1 t.txt
>> gzip -d g.tar.gz  # 可与tar连用 tar -xzvf g.tar.gz

# bzip2
>> bzip2 g.tar (生成g.tar.bz2) # 压缩
>> bzip2 -d g.tar.bz2  # 解压缩
# xz
>> xz -z g.tar (生成g.tar.xz) # 压缩
>> xa -d g.tar.xa  # 解压缩

# zip -r 压缩后名称 待压缩文件
>> zip  -r g.zip 1 t.txt        # 压缩
>> unzip g.zip
14、adduser、deluser 、passwd 用户管理(一般用不到)
## 用户文件
#1. /etc/passwd --管理用户UID/GID重要参数
   root : x : 0 : 0 : root : /root : /bin/bash
   用户名称:密码:UserID:GroupID:用户说明:主文件:shell
#2. /etc/shadow --管理用户密码(通过UID记录相应密码)
#3. /etc/group  --管理用户组相关信息(通过GID关联相应组信息)
   root : x : 0 : root
   用户组:用户组密码:GID:用户组包含账号名称
#4. /etc/gshadow --管理用户组管理员相关信息

## 新增用户
   > useradd [options] [username] #(根据默认文件生成用户,但不会在/home生成同名账号目录,利用passwd设置密码,没有密码不能登录)

   > passwd [options] [username] # 设置用户密码

   > adduser [options] [username] # (相当与useradd的封装,能自动生成用户目录,还得需要passwd设置密码)

## 删除用户
   > userdel 同理

   > deluser 
   
## 为用户添加组
# 添加用户到 docker 用户组
> sudo usermod 用户名 -aG docker   # groups  查看生效
   
## 用户权限
# root用户下下
chmod +w /etc/sudoers # 增加写权限
vim  /etc/sudoers # 增加sudo用户
'''
hadoop ALL=(ALL) NOPASSWD: ALL # 无密码使用sudo
'''
15、chmod 文件权限
#1. 修改文件权限
>> chmod +w/777 file 
16、磁盘、端口、系统资源查看问题(free 、df、du、lsblk、lsof)
# 1. free 内存使用情况
>> free -h
# 2. du path/file 目录或文件大小
>> du -h /home/hadoop
# 3. df 检查文件系统的占用情况
>> df -h
# 4. lsblk 列出所有可用块设备信息
>> lsblk

# eg: 查看文件系统是否存在占用过大
>> du -sh * | sort -nr

# 5.查看正在使用的端口
>> netstat -apnt # 列出所有使用端口
  -a(all): 显示所有连线中的Socket
  -p(programs): 显示正在使用Socket的程序识别码和程序名称。
  -n(numeric): 直接显示ip,而不是域名服务器
  -t(TCP): 显示TCP传输协议链接状态.

>> lsof -i:xx # 查看指定端口 (list open file)
17、进程管理命令(top、ps、kill、netstat)
# top 系统进程动态信息
>> top

# ps -aux 显示当前所有进程
>> ps -aux | grep python  # 过滤含python的进程

# kill 杀死进程
>> kill -9 pid # 杀死指定进程
>> pkill -9 关键词  # 杀死与之有关的所有进程

# netstat 是一个用于显示TCP和UDP网络连接、路由表和网络接口信息的命令行工具。以下是一些常用的netstat命令参数:

-a:显示所有连接和监听端口,包括TCP、UDP和UNIX域套接字。

-t:只显示TCP连接和监听端口。

-u:只显示UDP连接和监听端口。

-n:以数字形式显示端口号,而不是以服务名显示。

-p:显示与连接相关的进程信息。

-l:只显示处于监听状态的端口。

-r:显示路由表信息。

-s:显示网络统计信息。

-c:连续输出。
>> netstat -atnp
18、软件管理(rpm、yum)
# rpm 离线安装
>> rpm -ivh xxxx.rpm # 安装
>> rpm -e xxx        # 卸载
>> rpm -qa           # 列出所有已安装


# yum 在线安装,能自动处理依赖关系
>> yum search <keyword>  # 查找软件包
>> yum list              # 显示已安装或未安装的程序包
>> yum install package  -y  # 安装指定包
>> yum update  package      # 更新指定包
>> yum remove  package      # 删除程序包
19、vim 文件编辑器
#1. 命令模式
dd  # 删除一行
X   # 删除光标所在字符 = delete
ndd # 删除光标后几行
nyy # 复制光标后几行
p   # 粘贴
u   # 撤销
G   # 光标移动最后一行
gg  # 光标移动到第一行

#2. 编辑模式(命令行模式下,按下列命令进入编辑模式,按Esc 退出编辑模式)
i   # 光标前插入
a   # 光标后插入
I   # 行首插入
A   # 行末插入
o   # 光标下一行插入
O   # 光标上一行插入

#3. 末行模式(命令行模式下,按shift+:进入)
:w   # 保存
:q   # 退出
:wq! # 强制保存退出
20、cat、head、tail、more、less、sort、sed 内容查看命令
#1. cat 全文浏览
>> cat file
>> cat -n file # 带行号浏览
>> cat file1 file2 > file3  # 合并文件

#2. head 头部浏览(默认前10行)
>> head file
>> head -n 100 file # 显示文件前100行
>> head -n -100 file  # 显示除最后100行以外的内容

#3. tail 尾部浏览(默认后10行)
>> tail -100 file # 显示最后100行内容
>> tail -n +100    # 从100行处开始显示
>> tail -100f file  # 显示最后100行内容,并持续监控文件内容 (一般用于监听日志文件)

#4. more 分页查看
>> more file      # 分页查看文件内容(空格:向下一页 b:向上一页 q:退出)
>> more +10 file  # 从第10行开始显示内容
>> more +/'sting'  file # 从包含string的前两行开始显示内容

#5. less 分页浏览
>> less file    #(⬆、⬇ 按键:上1行、下1行 /string: 向下搜索string[n查看下一个,N查看上一个] G:移到最后1行 g:移到第1行 q:退出)
>> less -N file # 带行号显示
>> less -m file # 带%号显示

#6. sort 排序浏览
>> sort file     # 默认降序
>> sort -r file  # 升序查看
>> sort -u file  # 去重后查看
>> sort -n file  # 按数字排序
>> du -h ./* | sort  # 当前目录下文件按从大到小排序

#7. sed 流式浏览(优点可以指定行号)
'sed全称为Stream EDitor,行编辑器,同时也是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。'
'
>> sed -n '3p' /etc/passwd  # 读取文件的第3行
>> sed -n '2,5p' /etc/passwd  # 取出文件的第2行到第5行
>> sed -n '/11/p' t.txt       # 取出 含有11的行
21、systemctr 服务管理命令
#1. 服务管理
>> systemctl start 服务名(mysqld:mysql服务)
>> systemctl restart 服务名  # 重启服务
>> systemctl stop 服务名   
>> systemctl status 服务名

#2. 网络配置(一般不需要)
>> /etc/sysconfig/network-scripts/ifcfg.xx # 网络所对应的文件
>> systemctl restart network.service  # 重启网络

#3. 防火墙开关
>> systemctl stop firewalld  # 关闭防火墙
>> systemctl status firewalld # 查看状态
>> systemctl disabled firewalld # 关闭开机自启

22、at、crontab 定时任务
#1. at 一次性任务
语法:   at [选项] [日期时间]
选项:
-f:指定包含具体指令的任务文件
-q:指定新任务的队列名称
-l:显示待执行任务的列表
-d:删除指定的待执行任务
-m:任务执行完成后向用户发送 E-mail 参数 日期时间:指定任务执行的日期时间

>> systemctl status atd # 查看服务是否启动

>> at now+1min
at> touch 2.txt         # 一分钟后在当前目录下执行touch命令
at> ctrl+d # 保存任务
at> ctrl+c # 撤销任务

>>  at 15:00 # 下午3点执行任务
at> rm -rf 2.txt
at> ctrl+d
>> at -l # 查看待执行的任务 [2   Wed Mar 22 15:00:00 2023 a root]
>> at -d 2 # 删除已有的任务

#2. crontab 周期性任务 [循环执行、定期删除日志和备份文件/定期爬取数据等]
>> systemctl status crond # 查看服务是否启动
格式: crontab -u 用户名 -e 编辑文件 -l 查看所有定时任务 -r 删除所有定时任务(删除1个任务使用-e 自行编辑)
>> crontab -e
''
*[] *[] *[] *[] *[] 待执行命令或脚本
''
时间范围:
分:00-59
时:00-23
月:01-12
周:1-7

时间组合:
* 任意时间
- 范围时间 如 00-39 
/ 频率  如  */5 每5分钟
, 具体时点 如 3,4,5
23、ssh免密登录
#1. 密钥生成
>> ssh-keygen

#2. 密钥分发
>> ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop01
>> ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop02

#3. 验证免密登录
>> ssh hadoop02
24、date [日期]、 ln 链接、scp、rz文件传输
# 1. 获取日期
> date +%Y-%m-%d
> 变量名=`date +%Y-%m-%d`

# 2. 修改主机名
vim /etc/hostname

# 3. 配置主机IP映射
vim /etc/hosts
格式:ip hadoop hadoop

# 4. 安装telnet服务
yum install telnet-server
yum install telnet.*
> telnet 指定IP 端口 

# 5. 链接
>> ln 源文件 链接文件 # 硬链接 相当于拷贝
>> ln -s 源文件 链接文件 # 软连接 相当于创建一个快捷方式

# 5. scp linux->linux
>> scp local_file remote_username@remote_ip:remote_folder  # 从本地复制到远程
>> scp local_file remote_ip:remote_folder 

# 6. rz window <--> linux

二、shell脚本

解释执行的语言,类Python ,上述命令的自动化操作以完成某些功能。统一后缀 .sh (约定俗成)

1、read 、echo 输入输出
>> read -p '请输入一个三位数:' -a var # 相当于python input 键盘输入赋值变量var
>> echo $var # 打印 相当于python print
2、变量
变量名=变量值       # 变量赋值 等号两边不能有空格
$变量名 / ${变量名} # 变量指代使用

注: $符使用(本质上属于变量替换)
$n:指代脚本传入的指定位置的参数,$0:代指该bash文件名本身;两位数以上位置需要${10}
$*:所用脚本参数的内容,返回字符串,字符串中存在空格
$@:所有脚本参数的内容,返回多个字符串。
$#:返回所有脚本参数的个数。
$?:上一条指令的返回值,成功是0,失败是1。一般linux系统进程以系统调用exit()结束的,将其执行状态status值,回传给父进程,用来检查子进程的执行状态。
$$:shell本身的PID,即当前进程PID。
$!:shell最后运行的后台process的PID。

${}:作用1:划分变量名的边界(eg:each "${a}a" 第一个a是变量,第二个a是字符串)
    作用2:单行文本处理(eg: each "${#a}" 打印a变量的字符串长度)
3、分支语句 if 、case
# 1. if 语句
if [ 条件表达式 ]; then
    指令一
elif [条件表达式]
else
    指令二
fi

## 条件表达式:
# 1.1 字符串判断
str1 = str2     当两个串有相同内容、长度时为真
str1 != str2     当串str1和str2不等时为真
-n str1         当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)
str1          当串str1为非空时为真
# 1.2 数字的判断
int1 -eq int2   两数相等为真 [$a -eq $b]
int1 -ne int2   两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2   int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真
# 1.3 文件相关的if判断条件语句
-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真
# 1.4 复杂逻辑判断
-a        与 &&
-o       或 ||
!       非 [! $name='zs']
# 1.5 双条件表达式
if [[条件表达式1]||&&[条件表达式2]];then
fi


# 2.case 很少用
4、循环语句 for、while
#1. for
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

eg:
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

#2. while
while condition
do
    command
done

eg:
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done
5、函数
# eg1:
>> vim 2.txt
''
demoFun(){
    echo "这是我的第一个 shell 函数!"
}

echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
''
>> chmod +x 2.txt
>> sh 2.txt
''
-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
''


# eg2:

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}

# eg3: 传参
fun(){
  echo $0
  echo $1
  echo $@
  echo $*
 
}

fun 1 2 3 4 5 6

你可能感兴趣的:(Linux,linux,bash,服务器)