文章目录
2021.04.03
一、查看文件
1. cat :显示文本文件的内容
cat /etc/redhat-release 系统的版本号
cat -n 显示行号
uname -a: kernal 版本号
.sh 绿色 可执行文件,windows是.exe .bat .com
/bin 二进制文件
2. more : 回车一行一行,空格 一页页,只能看后面
3. less: 不能退出 ,能上下翻页 q
4. head:默认 前10行 head (-n) 3 3行
tail:后几行 -f 实时
echo 'world'> test.txt 重定向
echo '1' >> test.txt 追加 添加到后面
日志log
5. wc(word count ) 统计命令:行 单词数 字符
wc -l 只显示行数
6. echo 输出
echo $SHELL
cat /etc/shells
7. cp:复制
cp -r 目录
8. grep 查找文件(在文件内容找)
grep “ x” /etc/passwd (不支持通配符,支持正则表达式) 文件
^ 以 。。。开头
$以。。。结尾
^ $ 空白
-n 行号 ; -v 不包含“x”的;-i 不区分大小写;- w 独立单词;-r 递归查找
esc + .
9. diff 文件内容对比
二、日期 时间相关命令
1.date
date +%F 年月日 +%T 时间
date +"%F %T "操作数一起
在脚本中应用多
也可以用来修改日期和时间,设置日期和时间时的标准格式
“月日小时分钟年份” 年份可以是4位也可以是2位
2.hwclock(硬件的时间 BIOS)
hwclock -w 将系统时钟写入硬件时钟
-s
3.cal 日历 cal 1 2000 #2000年1月
4.stat 元数据
访问时间 access
更改时间 modify 内容改动
改动时间 change 元数据改变
为了避免对硬盘频繁进行写入,如果时间戳变化时间间隔短,不会修改
三、find 强大的文件查找命令(找文件)
1.locate x 含有x的所有 路径
如果创建的时间短 找不到。依赖于事先构建好的数据库。
2.find [查找起始路径][选项][查找条件][处理动作](支持通配符)
起始路径:默认当前路径, 如果指定为/ ,在整个硬盘中进行查找
**查找条件**:文件名、文件大小、文件类型、从属关系(组)、权限、时间戳
1) -name 精确 find /etc -name "pass*"
ls 只能找该目录 而find可以有多个子目录
2)-iname 忽略大小写
3)-empty 空目录
4)-type f普通文件 d目录 l软链接 b块设备 c字符设备
5)-size 文件大小 k、M、G + - 超过 低于
6)-not 取反
7)时间戳
天:-atime -mtime -ctime
分钟:-amin -mmin -cmin
+ - 之前 之内
8)-exec 进一步处理 == | xargs(配合管道,有一定的优势)
find -name "*ssh*" -type f -exec cp {} /xxx \; ({}前面的内容, 最后空格+\; 表示结束)
可以当成find 找的 **文本信息** 当成文件处理
处理动作:作出操作,默认为输出至标准输出
-ls 表示直接对查到的’-ls -l‘查看详细信息 不能-h
3. xargs(还会显示路径 )
和管道配合
find /tmp -name ".txt" | wc -l
find /tmp -name ".txt" | xargs
exec 一次性处理 会出现溢出问题,xargs 分批 快
extra:
配置文件 /etc 日志 /var
mkdir test0{1,2,3} 创建1 2 3
删除某个目录的文件或目录 用rm
若要删除子目录下的 find rm -f
history !1022 执行第1022命令
2021.04.05
一、内部命令和外部命令
1.内部命令
shell 自带的命令 cd ls
echo $SHELL
cat /etc/shells
2.外部命令
(用的时候需要安装,发行版本已经安装好了)
每个外部命令都对应了系统中的一个可执行的二进制程序文件(binary file)
- which ls (查 外部命令的程序文件)
- bin:存放可执行文件 ,常规命令,所有用户可以执行
- sbin:权限比较高的命令
- bin、sbin 软链接 /usr
- 按道理讲执行可执行文件,写成完整的路径 /usr/bin/ls。
但是有环境变量PATH ,会从PATH 的五个路径,找命令
3.type
type [command] 判断是外部还是内部命令
4.其它辅助命令
- ln [选项] 源文件 目标文件
link ,创建软硬链接 ,一般软(青色)
-s - alias[别名=‘标准shell命令行’] #写的时候不用中括号
直接alias 系统本身定义好的别名
unalias:撤销 - history <!序号>
history -d <序号> 删除
history -c 删除所有的
-w
-r
执行的命令放在缓存里,最后放在一个文件;HISTFILE - –help
- man 查看命令帮助手册
- clear
二、重定向
1. 标准输入与输出
标准输入:文件符0
标准输出:
标准错误输出:2
2. 标准输出重定向
ls /home > home.txt :将执行结果在home.txt上显示
.> 覆盖重定向 >>追加重定向
3. 标准输入重定向
<
cat < /etc/passwd
cat (把键盘输入的内容原样输出)
<<(在此处生成文件 ) :cat EOF
cat > 123.txt << EOF
4. 默认标准输出,不会将错误重定向
resolve:
>(只定向正确信息)
2>(定向错误信息)
&>(一概重定向)
三、管道符“|”
用来连接左右两个命令,将“|”左边命令的执行结果作为右边命令的输入
cat /etc/passwd | wc -l
wc -l /etc/passed (与上述不同,除了输出数字,还有文件路径)
find /etc -name "net*.conf" | wc -l
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
统计/etc目录下所有以“.conf”结尾的文件的个数:
find /etc -name "*.conf" -type f | wc -l
从etc/passwd 取出第十行:
head -n 10 /etc/passwd | tail -n -1
04.10
用户、组和权限管理
tar命令–文件打包与压缩
打包命令 tar(tape archive) 压缩命令:gzip、bzip2、xz。
.gz .bz2 .xz
先打包再压缩 : .tar.gz .tgz .tar.bz2
tar[选项] 打包或压缩后的文件名 需要打包的源文件或目录
-c(create) 创建“.tar”格式的包文件,不会压缩
-x 解包
-v 显示命令的执行过程。非必须
-f 指定要打包或解包的文件名称,该选项必须放到选项组合的最后一位。
-z 调用gzip来压缩 包文件
-j 调用bzip2来压缩
-J 调用xz来压缩包文件是,压缩后更小,但慢
tar -cf etc.tar /etc
tar -zcf etc.tar.gz /etc
tar -jcf etc.tar.bz2 /etc
tar -zxf etc.tar.gz -C xxx (-C指定路径)
解包不需要指定z j J -> tar -xf etc.tar.gz -C xxx
Shell脚本编程基础
Shell 脚本基本使用方法
创建文件 xx.sh
#!/bin/bash
cat /etc/centos-release
echo "Hello world"
执行:
1.bash xx.sh
bash -n 选项 检查语法错误
bash -x 显示执行命令与结果(类似ipython)
2.直接路径 ./xx.sh
3.sh xx.sh (sh是个软链接)
Shell变量
用户自定义变量
shell的变量 无需声明
-
变量名=变量值
a = 3
-
查看变量
echo $a
-
界定变量
echo ${a}b
-
""弱引用,’'强引用
day="Monday" today="Today is $day" :Today is Monday
day="Monday" today='Today is $day' : Today is $day
-
反撇号` 和 $() 执行命令
today="Today is `date`" a = $(rpm -qf $(which fdisk))
-
read命令
交互赋值,需要输入的数据 -p 选项 read -p "请输入一个数字:" num 赋值给num变量
-
变量运算符
% 取模 ** 乘方
a=2 b=3 let num=$a+$b #需要赋值 echo $[$a+$b] #$[] echo $(($a+$b)) #$(())
环境变量
全部大写字母
-
HOME:当前用户家目录
-
USER:当前用户的登录名称
-
UID:当前用户的UID
-
SHELL:当前用户使用的Shell
-
HISTSIZE:当前用户的历史命令条数
-
PWD:用户当前的工作目录
-
PATH:当前用户的命令搜索路径(指定了Shell中可执行文件所在的路径)
在脚本中引用USER 确定该脚本是否可以被其执行
-
LANG: 语言 zh_CN.UTF-8
en_US
echo "$USER: $SHELL"输出多个变量 中间有分隔符,
自定义环境变量
在某个shell中自定义创建的变量只在当前shell有效
pstree 查看树形
环境变量作用范围更广
定义环境变量
export NAME=“teacher”
在当前shell 以及 子shell 可以 ,别的shell不行,需要修改bash的配置文件
bash配置文件
profile类文件:只在用户登录时执行一次
1.全局:
/etc/profile(文件 直接修改代码)
/etc/profile.d(directory)/*.sh #对所有用户有效 (添加.sh脚本文件,此方法更可取)
以.d/*.sh的为主,查看/etc/profile,后面的循环命令显示以后为主
2.局部:~/.bash_profile(用户家目录下的重要隐藏文件) #只对当下用户有效
如果和全局有相同的某个配置,优先级更高
bashrc类文件:不仅在用户登录时会执行,而且每当用户打开新的Shell或者创建子Shell时也会被执行
1.全局:/etc/bashrc #对所有用户有效
2.局部:~/.bashrc(用户家目录下的重要隐藏文件) #只对当下用户有效
用法
修改完之后,用以下命令加载执行
source /etc/profile
. /etc/profile
位置变量
$n n:1-9 (接收所传参数)
!/bin/bash
echo $[$1+$2+$3] #只接收3个
./test.sh 237 564 145 (以空格为间隔)
预定义变量
echo $?
上一条的执行命令是不是执行了 真0 假1-255随机数(多为1)
-
$# 所传位置参数的个数
application:判断用户输入的参数是否满足脚本所需的个数,少于的话直接终止
if[ $# -ne 2]
then
exit
fi
- $0:表示当前脚本的名称
if[ $# -ne 2]
then
echo "Usage: $0 参数1 参数2"
exit
fi
条件测试与比较
条件表达式: [ 3 -gt 2 ] (两侧有空格)
测试文件状态
常用的文件状态测试操作符
-
-d:测试是否是目录
[ -d /etc/passwd ]
-
-f:测试是否为文件
-
-e:测试目录或文件是否存在
-
-r:测试当前用户是否有读取权限
-
-w:测试当前用户是否有写入权限
-
-x:测试当前用户是否有执行权限
-
-L:测试是否为连接
整数值比较
[ 3 \< 2 ] 转义 = [[ 3 < 2 ]]
操作符:
- eq 等于
- lt 小于
- gt 大于
- -ne 不等于
- -le 小于等于
- -ge 大于等于
字符串比较 = ,!= ,-z
****4.20
字符串比较主要是指比较两个字符串是否相同,测试字符串是否为空等。
= :匹配
!= :不匹配
-z:检查字符串是否为空
= 5 这里的5被视为字符串
read -p "Location:" file
/etc/fstab
[ $file = "/etc/fsab" ]
echo $?
逻辑测试
-a -o
-a 与
-0 或
!非
&& ||
不能用于方括号中来连接两个测试条件,主要用于连接两条命令
&& 当前面的命令执行成功后才会执行后面的命令
|| 当前面的命令执行失败后才会执行后面的命令
例如 检测 当前登录用户是不是root 是 输出hello 否
[ $USER = "root" ] && echo "hello"
[ $USER = "root" ] || echo "fault"
[ $USER = "root" ] && echo "hello" || echo "fault"
extra
du -h etc.tar 文件
du -hs 目录
vsftpd服务
systemctl
vim 文件 set nu显示行数
ping ip -c 2 ; 脚本识别$?
登陆系统的用户:
[ $(who | wc -l) gt 10 ]
pts 是远程终端登录
systemctl get-default 查看系统默认运行级别
chmod 750 /xx
***4.21
7.4程序结构
7.4.1 if选择语句
if 条件测试命令
then
else
fi
7.4.2 case分支语句
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
。。。。。
*)
默认执行的命令序列
esac
case语句的结构特点如下:
case行尾必须为单词“in”,每一模式必须以右括号)结束。
双分号 表示命令序列的结束,除了"*)"后的命令序列之外,其余的命令序列都需要加“;;”表示结束。
匹配模式可以使用通配符 a[0-9] |或
7.4.3 for循环语句
for 变量名 in 取值列表
do
命令序列
done
取值列表
1 2 3 4 5
{1..5} 两个点
seq [选项] 首数 增数 尾数
extra
if [] ;then 一行两个语句
{} 扩展符