对于linux来说:‘一切皆文件’,命令、进程、磁盘等都是文件表示。
# Linux 顶层目录含义
/ : 根目录;
/home: 存储普通用户的用户目录
/etc : 配置文件
/bin : 可执行命令
/sbin: 系统命令
/root: 管理员用户目录
/var : 日志文件
/usr : 软件默认安装位置
/opt : 系统给用户预留目录或自定义目录
注:-h 或 --help 查看命令参数详情
#1. 查找指定命令在文件系统中的位置
>> which ls
#2. 查找指定命令在文件系统中的位置和命令的安装位置
>> whereis ls
>> ls -a path # 展示所有文件包括隐藏文件
>> ls -l path # 展示文件详情(文件权限、大小等)缩写 ll
>> cd path
>> cd ~ # 返回用户家目录
>> cd - # 返回上一次所在目录
>> poweroff # 关机
>> shutdown -r now/10(分钟)/20:35 # 指定时间重启系统
>> shutdown -h now/10(分钟)/20:35 # 指定时间关机
>> shutdown -c # 取消shutdowm 预定操作
>> reboot # 立即重启计算机
# 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
# 显示mysql数据库中test库中所有含test的表,可用于批量删除
>> mysql -uhadoop -phadoop -e'use test;show tables' | grep 'test'
>> find /home -name '*.txt' # 查找/home 所含目录下所有txt后缀的文件
>> find / -size +512k # 全系统查找文件大小大于512k的文件
>> find / -atime -2 # 查找最后48小时访问过的文件
>> find / -mtine -1 # 查找最后24小时修改过的文件
# 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文件)
>> nohup cat 1.txt &
>> 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开头的所有文件
# 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
## 用户文件
#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
'''
#1. 修改文件权限
>> chmod +w/777 file
# 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)
# 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
# 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 # 删除程序包
#1. 命令模式
dd # 删除一行
X # 删除光标所在字符 = delete
ndd # 删除光标后几行
nyy # 复制光标后几行
p # 粘贴
u # 撤销
G # 光标移动最后一行
gg # 光标移动到第一行
#2. 编辑模式(命令行模式下,按下列命令进入编辑模式,按Esc 退出编辑模式)
i # 光标前插入
a # 光标后插入
I # 行首插入
A # 行末插入
o # 光标下一行插入
O # 光标上一行插入
#3. 末行模式(命令行模式下,按shift+:进入)
:w # 保存
:q # 退出
:wq! # 强制保存退出
#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的行
#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 # 关闭开机自启
#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
#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
# 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
解释执行的语言,类Python ,上述命令的自动化操作以完成某些功能。统一后缀 .sh (约定俗成)
>> read -p '请输入一个三位数:' -a var # 相当于python input 键盘输入赋值变量var
>> echo $var # 打印 相当于python print
变量名=变量值 # 变量赋值 等号两边不能有空格
$变量名 / ${变量名} # 变量指代使用
注: $符使用(本质上属于变量替换)
$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变量的字符串长度)
# 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 很少用
#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
# 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