Linux 基础用法
Linux
概念
-
Hurd操作系统,GNU研发的操作系统,过于追求完美至于还未发布www.gnu.org
-
LFS是从头定制linux系统的说明书,可以手动定制一个Linux操作系统
-
uname -r 查看内核版本hostnamectl也能查看内核版本
-
Linux哲学思想:
- 一切皆文件(包括硬件)
- 小型,单一用途的程序
- 链接程序,共同完成复杂的任务
- 避免令人困惑的用户界面
- 配置数据存储在文本中
命令
磁盘和文件空间 :fdisk df du
查看内存:free,top
查看网络:nmap(扫描IP地址的端口),ip , ifconfig ,route 路由 /proc路径下有cpuinfo,diskstats,iomem,meminfo 等端口的详细信息
文件目录与管理:cd pwd mkdir rmdir ls cp rm mv
查看文件内容 cat、tac、more、less、head 、tail
文件目录与权限 :chmod chown chgrp umask
文件查找:which、whereis、locate、find
查看进程:ps, top, htop
文本处理:sort(-n数字大小排序),uniq(统计重复行),tr(替换,删除),cut(按列剪切),wc(统计行数),paste(两个文件相同行合并显示),rev(将字符反向显示)
三剑客:grep,sed,awk
- 排障命令
磁盘和文件空间 :fdisk df du
查看内存:free,top
查看网络:nmap(扫描IP地址的端口),ip , ifconfig ,route 路由 /proc路径下有cpuinfo,diskstats,iomem,meminfo 等端口的详细信息
文件目录与管理:cd pwd mkdir rmdir ls cp rm mv
查看文件内容 cat、tac、more、less、head 、tail
文件目录与权限 :chmod chown chgrp umask
文件查找:which、whereis、locate、find
查看进程:ps, top, htop
文本处理:sort(-n数字大小排序),uniq(统计重复行),tr(替换,删除),cut(按列剪切),wc(统计行数),paste(两个文件相同行合并显示),rev(将字符反向显示)
三剑客:grep,sed,awk
- 基础命令
命令总结:
du -sh 查看目录或文件所占用磁盘空间大小
选项:
-h:以人类可读的方式显示
-a:显示目录占用的磁盘空间大小,和目录下的文件或目录的大小
-s:显示目录占用的磁盘空间大小,不显示其下目录或文件的大小
-c:显示几个目录或文件占用的磁盘空间大小,还要统计他们的总和
-l:统计硬连接占用磁盘空间的大小
-L:统计符号链接所指向的文件占用的磁盘空间大小
--apparent-size:显示目录或文件自身的大小
du -sk filename :查看指定文件大小
du -lh --max-depth=1 :查看当前目录下一级子文件和子目录占用的磁盘空间
bc 计算器
free 查看内存
lsnlk 查看块设备
init 0 3 5 6 切换运行模式
poweroff
who -r
ifconfig
tty
reboot 重启
shutdown -r +10 10分钟后关机
shutdown -c 取消
uname -r 查看内核版本
echo $SHELL 查看shell类型
strace 查看程序的调用库
ltrace 查看库的调用函数
nano 命令行中图形编写工具
lscpu 查看cpu
cat /prc/meminfo 查看内存
lsblk 查看挂载磁盘
hostnamectl 查看系统版本信息
cat /etc/centos-release 查看系统版本
cat /etc/motd 修改登陆提示信息
type 查看命令为内/外部命令
hash 显示命令的执行信息(例如执行次数)
hash -d [命令] 清除命令在缓存中的记录;命令在执行一次后会记录在缓存中,下次使用时会直接使用内存缓存中的命令路径
which 显示命令执行路径
更改命令别名:hash -p /usr/bin/free f ;free命令改为f零时别名
hash -l 详细显示
hash -t rm 显示rm的命令路径
cat /etc/shells 查看支持的shell版本
alias 别名
unalias 取消别名
\ifconfig 使用原始命令(当别名名称与原始命令相同时,暂时使用一下原始命令的时候)
/etc/bashrc 设置全局配置
分号;命令顺序执行 (例如:sleep 10;ls;pwd)
clock 硬件时间
date 系统时间
date +%s 显示距离19700101的秒数
date -d @秒数 ,转换为天数时间
date +%F 年月日
date +%F@%T
date -d @秒数 “+%Y-%m-%d %H:%M:%S" 时间格式转换
ls /etc/loacltime -l 查看时区
timedatectl list-timezones查看支持的时区
reset 乱码后重置 复位
cal 日历
windows 命令,
查看本机进程tasklist
查看远程主机进程 tasklist /S 1.1.1.1 /U administantor /P admin
help
rz/sz
lsb_release 查看版本信息
clear
logout 注销
screen命令:
用法一:两个远程终端连接同一台主机服务器时,实现两个终端间屏幕共享
用法二:在远程连接主机时开启screen,防止网络波动的情况下断开链接导致会话时的操作丢失,重新连接回终端后可恢复当时会话
创建新screen会话:screen -S [SESSION]
加入screen会话:screen -x [session]
退出并关闭screen会话:exit
剥离当前screen会话:ctrl+a,d
显示所有已经打开的screen会话:screen -ls
恢复某screen 会话:screen -r [SESSION]
iconv 转换文件格式
例如转换为中文gb2312编码:iconv -f gb2312 test.txt -o tets2.txt
echo 回显
touch 创建文件 ;touch f{1..10}
cp f1{,.bak} 备份文件,f1自由组合括号中的字符
~2tab键:显示所有用户
$2tab键:显示所有变量
/2tab键:显示所有根目录下一级目录,包括隐藏目录
whereis 查看程序或命令路径
whatis [命令] 查看命令的简单帮助说明
help 查看帮助
man 查看帮助
man agetty :查看帮助,修改/etc/issue 显示信息
man -k agetty :列出所有sgetty命令相关的帮助列表
!service :执行命令历史中最近一次执行service开头的命令
PS1="\[\e[1;35m\][\u@\h \w]\\$\[\e[0m\]" :设置颜色
history -p `ls pwd` :反向单引号,执行命令但不记录到history中
]#HISTIMEFORMAT="%F %T-->" :添加变量,使执行history时显示时间
HISTCONTROL=ignorespace :忽略所有以空白开头的命令记录到历史history中
#echo $HISTCONTROL 显示当前变量设置参数
#HISTCONTROL=ignoreboth 修改变量参数,使history中不记录重复出现的命令
ctrl+a 跳到命令行字符首
ctrl+e 跳到命令行字符尾
mv 移动
cp 拷贝 -n 覆盖原文件;-i 显示提示; -av 复制所有信息包括复制目录,并且显示详情; --backup=numbered 在复制时对已有的文件做备份并且编号; cp -av /etc/ /data/backup`date +%F`备份目录
mv 移动或重命名
rename '.log' '.log.bak' f* 将f开头的.log结尾的所有文件改名为.log.bak结尾的文件
alias rm='mv -t /app/' . -t 默认将所有源参数移动到目录中
touch 创建新文件和刷新时间戳
> /boot/bigfile :清空大文件内容并且立即释放空间;rm删除时如果文件打开中,是不能立即释放空间,而大于好 > 可以
ls -i :查看节点inode编号,每个分区独立;创建一个文件时如果报错没有no space,但磁盘空间还有,则有可能时节点编号被用完了
-d:显示目录
-l:显示详情
-h:大小转换为k
-1:垂直显示文件列表
-t:以文件刷新时间顺序显示
-r:倒序显示
-lu:列出文件的atime (access time 访问时间;显示文件数据最后被修改时间,读文件会改变时间)
-lc:列出文件的ctime(change time 状态改动时间,文件权限,属主属组 链接数改变的时间)
-l:列出文件mtime(modify time 修改时间;显示文件内容最后被修改的时间)
inode编号与文件名一一对应,文件名是指向inode的,inode指向数据块
watch -n 1 ls :1秒执行一次ls命令,监控命令
echo f{1..524288} | xtargs touch :xtargs解决运行命令时参数太长的错误,此做法是将echo的参数一个一个的传给touch来执行,避免touch f{1..524288}此命令的报错
shred命令:覆盖数据
shred -zvun 10 file
-z:用零来填充数据块,使其删除后的数据块被填充
-v:查看详情
-n 10:表示覆盖次数,后跟数字十次
-u:删除文件名
ln file /root/file2 :硬连接
ln -s file /root/file2 :软连接,文件大小是链接文件的字符数个数
软/硬连接区别:
硬连接:硬连接是同一个文件,不允许对目录链接,连接数+1,不能跨分区建立链接,删除原文件不影响访问
软连接/符号链接:软连接不是同一个文件,可以对目录建立链接,链接数不变,可以跨分区建立,删除原文件无法访问
注:建立软连接时,源文件的相对路径是相对软链接文件的相对路径,而不是当前工作目录的相对路径
例如:ln -s ../../app/f1 /etc/sysconfig/f11 ;相对路径的写法中../../代表基于f11而言,切换到上一级目录为/etc,再切换到/etc的上一级目录/根,而原文件在根下的/app目录下
readlink 查看文件的链接文件
file :查看文件类型
ls > /dev/pts/1 将ls的输出重定向到pts1窗口
> :重定向输出
2> :若命令执行错误的输出
&> :所有显示内容重定向
>> :追加到问价结尾
2>&1:错的变为对的
1>&2 :对的变为错的
标准输入(STDIN) -0 默认接受来自键盘的输入
标准输出(STDOUT) -1 默认输出到终端窗口;执行正确的内容
标准错误(STDERR) -2 默认输出到终端窗口;执行错误的内容
写法一:(errcmd;hostname) &>> /data/true.log 无论执行正确还是错误都重定向到文件中
写法二:(errcmd;hostname) > /data/true.log 2>&1 正确内容重定向到文件,错误内容重定向到正确输入中
tr命令:文本处理工具,转换和删除
例如:tr 12 ab 将输入信息中的12替换为ab
例如:tr '1-9' 'a-i' 将1-9替换为a-i
例如:tr 'a-z' 'A-Z' < fstab.hd 将文件内容转换为大写
例如:tr -d 'a-z' < fstab.hd 将输入的文件内容中的小写内容删除
例如:tr -s 重复字符压缩为一个字符
例如:tr -c 保留取反
hexdump 命令:查看文件的编码格式(二进制,八进制,十六进制),即查看文件对应字符集编码
例如:hexdump -C file1
00000000 61 0a 62 0a 63 0a 64 0a |a.b.c.d.|
00000008
hexdump -c file1
0000000 a \n b \n c \n d \n
0000008
多行重定向用法:
1.在命令行定义eof(可随意定义)为结束标志字符,当下方输入项中出现eof时则标志结束输入
# cat > f1 <<eof
> assfg
> rfvtghn
> aqwe123
> 1324
> eof
2.多行输入,以自定义o为标志结束符
[luojie@dafeng-mac:~/data]mail -s "www" root <<o
> how are you
> how old are you
> what is are you doing
> o
tar -cvf 打包
tar -xvf 解包
tar -tvf 查看
tee命令:打印命令执行结果并且将结果保存至文件
tee -a 追加内容至文件尾部
例:ls |tee ls.out
例:ls |tee -a ls.out | tr -d f
exec命令:人为指定文件描述符
1-100加法
echo {1..100} | tr ' ' + |bc
seq -s + 1 100 |bc
lsof命令:查看被删除的文件
more
pwconv (默认)将passwd文件中密码存放到/etc/shawd文件中
pwunconv 将passwd文件中隐藏的密码显示到passed文件中
chfn命令:修改passwd中用户的描述信息(第五列中的内容)
usermod -d /home/wang wang . 更改用户家目录路径
openssl rand -base64 30 生成30位的随机数,可用作登录口令
在/etc/passwd文件中,用户行的最后一个字段若为nologin则表示该用户不允许登录
chsh -s /bin/csh wang 更改用户shell类型
/etc/passwd中字段信息
用户名:用户密码:用户id:组id:用户描述信息:用户家目录:用户shell类型
man 5 shadow 帮助文档
用户:/etc/shadow密码文件中
useradd 添加用户
wang:!!:17969:0:99999:7:::
密码行段中两个!!表示该用户已被锁定,不允许以空密码登录,若取消该符号则可以以空密码登录
17969:表示该口令的创建日期天数,若为0表示口令即时过期 chage -d0 wang
0: 表示口令的最短有效期,0表示随时可以改口令,若为2或其他数字表示2天内不能改口令
99999:为最长有效期 ; chage wang 命令可以改口令有效期
7:口令过期前7天提醒更改口令
chage -l wang 列出口令用户信息
date -s '40 day' 将系统时间改为40天后 clock -s:硬件时间同步到系统时间
usermod -L wang 给用户wang账号锁定,即在/etc/shadow文件中加上一个!
usermod -U wang 解除上述锁定
suermod -G '' wang 清除用户附加组
用户组:/etc/gshadow /etc/group
groupadd 添加组
gpasswd 设置组密码,-a 也可以添加用户到组
usermod -G opt mge 添加用户opt到mge组
groupmems -l -g opt 查看opt组中有哪些用户
用户管理命令:
useradd 添加
useradd -g opt wang 创建wang账号并添加到组opt中
usermod 修改
userdel 删除
组账号管理命令:
groupadd
groupmod
groupdel
newusers user.txt 批量创建用户,文件格式为passwd中显示的格式
cat passwd.txt | chpasswd 批量添加用户密码,文件格式为用户:密码一一对应的格式
查看用户:
id wang
getent passwd wang
getent shadow wang 查看用户shadow信息
/etc/default/useradd 创建用户的默认配置参数变量文件
/etc/login.defs 默认创建账户配置
例:创建用户gentoo 附加组为bin和root
useradd -G bin,root -s /bin/csh -c "hello world" gentoo
例:更改用户名,也是只改用户名,组/id等信息不影响
usermod -l oldname newname
权限管理:
ACL:Access Control list 访问控制列表,全面控制权限,实现灵活的权限管理
1.除了文件的属主,属组和其他人,可以对更多的用户设置单独的权限使其更灵活,可以对指定的用户或者指定的组设置单独的权限
2.centos7默认创建的xfs和ext4文件系统具有acl功能
3.centos7之前版本,默认手工创建的ext4文件系统无acl功能,需手动增加
tune2fs -o acl /dev/sdb1
mount -o acl /dev/sdb1 /mnt/test
4.ACL生效顺序:所有者,自定义用户,自定义组,其他人
5.一但对文件设置了特殊权限那么在文件详情的属组列中显示的权限就不是属组,而是mask(掩码)权限
6.例如 setfacl -m u:wang:rw /etc/f1 设置 wang用户拥有 rw 权限
getfacl /etc/f1 查看文件权限
setfacl -x u:wang /etc/f1 删除文件的特殊权限
7.getfacl f1 查看文件特殊权限详情中,mask限定属主属组所拥有的最高权限
8.实用场景,例如在一个目录下需要让tom用户拥有目录下所有文件的rw权限,但是目录下的文件有不同的属主和属组,如果直接更改所有属主为tom的确可以达到目的,但如果那一天要收回tom的访问权限时就会遇到麻烦,不可能逐一修改每个文件的属主,此时就可以用ACL来实现如下:
添加权限:chown -R -m tom:rw /html/*
或者:chown -R -m d:tom:rw /html d默认目录下新创建的文件都有tom的rw权限
查看特殊权限:getfacl /html/*
清楚ACL权限:setfacl -R -b /html/*
9. getfacl f1 |setfacl --set-file=- f2 将f1的ACL权限复制给f2
chown 设置文件的属主
chgrp 设置文件的属组信息
在目录下删除或者创建时看的是验证对该目录是否有写/执行权限
chmod -R a+X /app/ 只对app目录添加执行权限,若为小写x则是为app下所有文件递归添加执行权限
大写X:只给目录x权限,不给文件x权限 4r 2w 1x
umask :bash内嵌命令可直接查询,用户掩码,决定用户创建文件或目录的默认权限,若更改umask则影响用户默认创建目录/文件的权限
umask 4位数取后3位
umask 411 改umask为411,则默认文件权限为255,目录为366
创建目录 umask + 用户默认权限 = 777
创建文件 666-umask 则观察结果:
有偶数:最终结果就是用户默认权限
有奇数:最终结果加1就是默认权限
例:666-234=432=442
umask -p 显示umask
umask -S 模式方式显示
suid
chmod u+s /目录或程序
1.suid只能作用在二进制程序上,不能作用在script脚本上
2.执行suid权限的程序时,此用户将继承此程序的所有者权限,如passwd,su等命令都有s权限
sgid
chmod g+s /目录或程序
1.作用在二进制程序上,执行sgid权限的程序时,此用户将继承此程序的所属组权限
2.设置在目录上时,在此目录下的新文件的所属组,将自动继承目录的所有属组
sticky
1.只能作用在目录上
2.具有sticky权限的目录,普通用户只能自己删除自己文件
chattr和lsattr命令:
chattr +i /etc/passwd :对文件添加i权限(写保护),使它不能被任何人修改,root也不能
chattr +a /etc/passwd :不能删除只能追加文件
chattr +A /etc/passwd :不更新读取文件的时间
lsattr /etc/passwd :显示文件的特殊权限
文本处理类命令工具:
1.文件内容查看:more,less和cat,head,tail
cat -n:显示行号
cat -A:显示所有控制符(显示换行符)
cat -b:非空行编号(空行不显示行号)
cat -s:压缩连续的空行成一行
head -c 20: 显示20个字节 。 例生成随机数:openssl rand -base64 30 |head -c30 ;tr -dc '[:alnum:]_' < /dev/urandom | head -c20
head -n 10: 显示前10行
2.文件截取:head和tail
tail -f :跟踪文件不退出
tail -n 10:显示后10行
tail -c 10:显示后10个字节
tailf :类似于tail -f,tailf更剩资源,当文件不增长时并不访问文件
3.按列抽取:cut
cut -d" " -f1 /var/log/httpd/access_log 以空格为分割符取第一列的ip地址
mac获取磁盘使用率:df|grep /dev/ |tr -s " " % | cut -d% -f8
获取第1,3,7列 cut -d: -f1-3,7 /etc/passwd
-b:以字节为单位进行分割
-c:以字符为单位进行分割
-d:自定义分隔符,默认为制表符
-f:与-d一起使用,指定显示那个区域
-n:取消分隔多字节字符。
4.按关键字抽取:grep tail 过滤行
5.paste 合并两个文件同行的列合并到一行
paste [option] ...[file]
-d 分隔符:指定分隔符,默认用tab键
-s :所有行合成一行显示
paste f1 f2
paste -s f1 f2
6.wc命令:
默认显示:统计行,单词个数,字节个数
-l:只统计行数
-w:只统计单词数
-c:只统计字节数
-m:只统计字符数
-L:显示文件中最长行的字节数
7. sort 文本排序
-r 执行反方向(由上至下)整理
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c作为字段界定符
-k X 按照使用c字符分隔的X列来整理能够使用多次
例:按字母顺序排序:sort -t: -k1 /etc/passwd
例:按uid数字顺序排序:sort -n -t: -k3 /etc/passwd -k3为第三列
8. uniq命令:从输入中删除前后相接的重复的行
uniq [option]...[file]...
-c:显示每行重复出现的次数
-d:仅显示重复的行
-u:仅显示不曾重复的行
连续且完全相同为重复
和sort配合使用:sort test.txt|uniq -c
9.diff命令:比较两个文件内容的差异
-u 显示更多信息
patch命令 复制在其他文件中进行的改变
$diff -u f1 f2 > f1_f2.patch
$patch -b f1 f1_f2
三剑客:grep,sed,awk均支持正则表达式
1. grep命令
egrep=grep -E fgrep=grep -F
-i:搜索时忽略大小写
-n:显示行号
-q:静默模式,不显示出来搜索结果
-v:显示不被匹配到的行(搜索结果取反)
-o:仅显示匹配到的字符串
-A #:显示匹配的后#行
-B #:显示匹配的前#行
-c #:显示匹配的前后#行
-e:实现多个搜索项的或关系 。 grep -e 'cat' -e 'dog' file
-w:匹配整个单词,而不显示单词中包含搜索项的
例:ps -ef | grep nginx | grep -cv grep 查看nginx是否在线,结果为0则不在线,大于0则有nginx进程在线
2.sed命令
简介:行编辑器,可直接修改文件,sed是一种流编辑器,有自己的一套语言,将文件内容一行一行输入到内存的模式空间中进行处理,然后自动打印到屏幕,处理下一行内容时默认清除上一行内容
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:sed [option]...'script' inputfile...
处理对象:管道文本,键盘输入,变量,字符串,文件重定向
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑
-f:/PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i.bak:备份文件并原处编辑
script:(脚本格式)
【重点用法一】
'地址和命令' :地址表示要处理的那一行,命令表示要处理的命令
地址定界:
(1)不给地址:对全文进行处理
(2)单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3)地址范围:
#,# 第几行到第几行
#,+#
/pat1/,/pat2/ 可以正则表达式
#,/pat1/
(4)~ :步进
1~2 奇数行
2~2 偶数行
编辑命令:
d:删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a [\]text: 在指定行后面追加文本;支持使用\n实现多行追加
i[\]text: 在行前面插入文本
c[\]text: 替换行为单位或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile: 读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理
【重点用法二】
搜索替换:s/// 或者 s@@@ ,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行报存至文件中
;连接多个判断语句
& 引用前面模式匹配到的内容,类似于后向引用
例:sed -r 's/quiet/& xxx/' /etc/default/grub
与这个语句相同 sed -r 's/quiet/\1 xxx/' /etc/default/grub
【高级编辑命令】
特点是:在有pattern space(模式空间)的情况下新增了一个hold space(保持空间),保持空间存放的是默认空间中未处理完的临时存放地,
两个空间都在内存中,在处理语句时起到相互协调的作用,实现更高级的用法
p:打印模式空间开端至\n内容,并追加到默认输出之前
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d:删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,
并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空
间不包含换行符,则会像发出d命令那样启动正常的新循环
示例:
sed -n 'n;p' FILE seq 1 10 | sed -n 'n;p' 显示偶数行
sed '1!G;h;$!d' FILE 倒序打印
sed 'N;D' FILE 打印最后一行
sed '$!N;$!D' FILE 打印最后两行
sed '$!d' FILE 打印最后一行
sed 'G' FILE 在每一行下插入空行
sed 'g' FILE 空行覆盖没一行
sed '/^$/d;G' FILE 每一行下面插入空行
sed 'n;d' FILE 打印奇数行
sed -n '1!G;h;$p' FILE 倒序打印
例如:
要在sed中使用变量的方法,及单引号加双引号括起变量
echo $i |sed -r 's@'"$i"'@'"$i"' stop@'
sed 'p' /etc/issue 会输出两次文件内容,原因是sed本身会自动打印文件内容出来,而命令p也是打印的意思
sed -n 'p' /etc/issue 取消自动打印,只显示一遍内容
sed -n '9,12p' /etc/fstab 显示9到12行内容
sed -n '9,+3p' /etc/fstab
cat -n /etc/passwd | sed -n '1~2p' 或 sed '2~2d' 打印奇数行
cat -n /etc/passwd | sed -n '2~2p' 或 sed '1~2d' 打印偶数行
cat -n /etc/passwd | sed '3,6a\ =======' 在3至6行后追加=号
sed -i.bak '7a alias cdns="cd /etc/sysconfig/"' ~/.bashrc 备份并且添加别名
sed '/^# Source/i\ xxxxx' ~/.bashrc 匹配Source开头的行的前一行添加内容
sed '/^SELINUX=/c SELINUX=disable ' /etc/selinux/config 替换匹配的段为指定内容
sed '/^alias/w a.txt' ~/.bashrc 模式匹配的行保存到a.txt文件中
sed '/^alias/r /etc/centos-release' ~/.bashrc 将文件内容添加到模式匹配的行下面
sed -n s/bash$/nologin/p /etc/passwd 替换bash结尾的行为nologin
sed -r 's@(/bin/bash)$@----\1===@' /etc/passwd 后向引用模式匹配的对象并添加字符
ifconfig eth0 | sed -n '2p' | sed 's#inet# #g' | sed 's/netmask.*//g' 搜索替换找出ip
ifconfig eth0 | sed -n '2p' | sed -r 's@inet(.*)netmask.*@\1@' 后向引用的方法获取ip
ifconfig eth0 | sed -r -n '2s@inet(.*)netmask.*@\1@p'
sed -rn 's@.*release (.).*@\1@p' /etc/centos-release 取操作系统版本号,后向引用的方法
ifconfig eth0 | sed -r '2!d;s/.*inet //;s/ netmask.*//' 连接多个判断语句
echo "/etc/sysconfig/network-script/ifcfg-ens33" | sed -rn 's@.*/(.*/)(.+)/?@\1@p' 取目录名
echo "/etc/sysconfig/network-script/ifcfg-ens33" | sed -rn 's@.*/(.*/)(.+)/?@\2@p' 取文件夹名
sed -n '/^$/=' file 显示空行的行号
sed '/^$/d' file 删除文件的空白行
sed 's/test/newtets/g' file.txt 搜索带有test的行替换为newtest,全局搜索
sed 's/UUID/TAB/' /etc/fsta 搜索替换
sed 's/^UUID/# &/' /etc/fstab 井号注释掉UUID开头的行
文件查找:locate find命令
在文件系统上查找符合条件的文件
文件查找:locate find
非实时查找(基于数据库查找):locate
实时查找:find
locate命令:
查询系统上预建的文件索引数据库:/var/lib/mlocate/mlocate.db
依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库输入updatedb
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:查找速度快,模糊查找,非实时查找,搜索的是文件的全路径,不仅仅是文件名,可能只搜索用户具备读取和执行权限的目录
find命令:
实时查找工具,通过遍历指定路径完成文件查找
工作特点:查找速度 慢,精确查找,实时查找,可能只搜索用户具备读取和执行权限的目录
语法:find [OPTION]...[查找路径][查找条件][处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名,大小,类型,权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件:
指搜索层级:
-macdepth level 最大搜索目录深度,指定目录为第一级
-mindepth level 最小搜索目录深度
根据文件名和inode查找:
-name "文件名称" :支持通配符 * ? [] [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex "PATTERN" :以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
根据属主,属组查找:
-user USERNAME:查找属主为指定用户(uid)的文件
-group GRPNAME:查找属组为指定组(GID)的文件
-uid USERID:查找属主为指定的uid号的文件
-gid GROUPID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件
根据权限查找:-perm [/|-] MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要一位匹配即可,或关系,+从centos7开始淘汰
(例:find -perm /444 -type f 或关系,属主属组其它 中有一个含有4读权限都能匹配)
-MODE:每一类对象都必须同时拥有指定权限,与关系
O 表示不关注
例:find -perm 755 会匹配权限模式恰好是755的文件
find -perm +222 只要当任一人有写权限时就会匹配
find +perm -222 只有每个人有写权限时才会匹配
find -perm -002 只有other(其他人)有写权限时,才会匹配
处理动作(在find找到匹配的文件后做处理)
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件
-ok COMMAND {} \; :对查找到的每个文件执行有COMMAND指定的命令,对于每个文件执行命令之前,都会交互要求用户确认
参数替换 xargs
--由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
--xargs用于产生某个命令的参数,xargs可以读入stdin标准输出的数据,并且以空格符或回车符将stdin的数据分隔成为arguments
--注意:文件名或者是其他意义的名词内含有空格符的情况
--有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
示例:
ls f* |xargs rm
find /sbin -perm +700 | ls -l
find /sbin -perm +7000 | xargs ls -l
find和xargs格式:find | xargs COMMAND
组合条件:
与:-a
或:-o
非:!,-not
德.摩根定律:
(非A)或(非B) = 非(A且B)
(非A)且(非B)=非(A或B)
根据文件大小来查找:大小不是精确匹配,而是区间匹配
-size [+|-]#UNIT 常用单位:k,M,G,c(byte)
#UNIT:(#-1,#)
如:6k表示(5k,6k]之间的文件
-#UNIT: [0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
如:找到一个50到100兆大小的文件
find / -size +50M -size -101M
根据时间戳搜索:
以天为单位
-atime [+|-]# n:查找n天以前被访问过的所有文件
#: [#,#+1)
+#:[#+1,∞]
-#:[0,#)
-mtime n :查找n天以前文件内容被修改过的所有文件
-ctime n :查找n天以前文件状态被修改过的所有文件
以分钟为单位:
-amin n :查找n分钟以前被访问过的所有文件
-mmin n :查找n分钟以前内容被修改过的所有文件
-cmin n :查找n分钟以前文件状态被修改过的所有文件
find /etc -mmin 1 查找etc下最近1分钟发生变化的文件
例:find -name snow.png
find -user joe -o -user jane
find -not \( -user joe -o -user jane \)
找出/tmp目录下。属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -o -name 'f*' \) -ls
或者:find /tmp -not \( -user root -o -name 'f*' \) -ls
以1个字节为单位新建立文件f3,大小为2048个字节
dd if=/dev/zero of=f3 bs=1 count=2048
正则表达式:
1.字符匹配:
. 匹配任意单个字符
[] 匹配制定范围内任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比blank包含的范围广)
[:cntrl:] 不可打印的控制字符(空格,删除,警铃。。。)
[:digit:] 十进制数字[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
2.次数匹配:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次包括0次;贪婪模式:尽可能长的匹配
.* 任意长度的任意字符;注意通配符和正则表达式,当正则表达时需要用引号扩起来
\? 匹配其前面的字符0或者1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
3.位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 用于模式匹配空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定;用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\<PATTERN\> 匹配整个单词
4.分组: \(\)将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录在内部的变量中,这些变量的命名方式为:\1,\2,\3.....
\1 表示从左侧起第一个左括以及与之匹配右括号之间的模式所匹配到的字符
反向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身;注意匹配的是前面一个条件匹配的结果而不是匹配模式
或者:\| 或的关系
示例:a\|b 表示a或者b
5.扩展的正则表达式:比上述的正则表达式更简洁,最大的是没有斜线了\做转译
egrep = grep -E
正则表达式的字符匹配上同
次数匹配,分组,反向引用等较上述的没有\来表示,例如{m,n}至少m次至多n次
vim介绍
1.打开文件vim file默认为normal命令模式,按aAiIoO进入插入模式,按:冒号可将命令模式切换为EX模式w,q,wq,q!,wq!
2.在插入模式中:w /data/f2.txt 表示将当前修改状态另存为一个新文件为/data/f2.txt
3.命令模式下esc后按ZZ表示保存退出,ZQ表示不保存退出(此操作不显示出来,直接运行,较危险)
4.在vim中执行命令 !command
5.在vim中读入命令的输出结果 r!command
6.行首行尾跳转:
^:跳转至行首的第一个非空白字符
$:跳转至行尾
0:跳转至行首
行间移动:
G:最后一行
1G,gg:第一行
ctrl+f:向文件尾部翻一屏
ctrl+b:向文件首部翻一屏
ctrl+d:向文件尾部翻半屏
ctrl+u:向文件首部翻半屏
字符编辑:
x:删除光标处的字符
#x:删除光标处起始的#个字符
xp:交换光标所在处的字符及其后面字符的位置(两个字符交换位置)
~:转换大小写
J:删除当前行后的换行符
替换命令(r,replace)
r:替换光标所在处的字符,例如rd将光标所在处的字符替换为d
R:切换成REPLACE(替换)模式,即在光标处替换任意字符
剪切:
dd:剪切光标所在处当前行
n+dd:剪切光标所在行以及n行
按p粘贴
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除
d$:删除到行尾
d^:删除到行首
d0:删除到行首
dd:删除整行字符
dw:删除光标所在字符到整个单词词尾
复制命令:(y,yank):
y:复制,行为相似于d命令
y^,y$,y0,ye,yw,yd,#COMMAND
yy:复制行
#yy:复制多行
y:复制整行
粘贴命令(p,paste)
p:缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,粘贴至当前光标所在处的后面
P:缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,粘贴至当前光标所在处的前面
cc:删除当前行并输入新内容,相当于S
C:删除当前光标到行尾,并切换成插入模式
地址定界 (配合上述操作指令)
:start_pos,end_pos
# 具体第#行,例如2表示第2行
#,# 从左侧#表示起始行,到右侧#表示结尾行
#,+# 从左侧#表示的起始行,叫上右侧#表示的行数 。 :2,+3 表示2到5行
. 表示当前行
$ 最后一行
.,$-1 表示当前行到倒数第二行
% 全文,相当于1,$ 表示从第一行到最后一行
查找
/PATTRERN:从当前光标所在处向尾部查找
?PATTRERN:从当前光标所在处向文件首部查找
n:与命令同方向,控制搜索方向
N:与命令反方向
扩展命令模式:查找并替换
s:在扩展模式下完成查找替换操作
格式:s/要查找的内容/替换为的内容/修饰符 (修饰符可不写)
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用\1,\2....等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容
修饰符:
i:忽略大小写
g:全局替换;默认情况下,每一行只替换第一次出现
gc:全局替换,每次替换前询问
查找替换中的分隔符/可替换为其他字符,例如:@,#
将/etc全局替换为/var s@/etc@/var@g s#/boot#/#i
例在文件中的每一行首添加一个# :
%s/^[^#]/#&/
注:中括号中的^表示排除,括号外的^表示行首锚定
撤销更改:
u 撤销最近的更改
#u 撤销之前多次更改
U 撤销光标落在这行后所有此行的更改
按ctrl -r重做最后的“撤销”更改
. 重复前一个操作
n. 重复前一个操作n次
vim的寄存器
1.vim有26个命名寄存器和1个无命名寄存器,常存放在不同的剪贴板中,可以在不同会话间共享
2.寄存器名称a,b,c......z,格式为:"寄存器 放在数字和命令中间
如:3"ayy 表示复制3行到寄存器名称为a中
"ap 表示将a寄存器中的内容粘贴
3.未指定,将使用无命名寄存器
4.有10个数字寄存器,用0,1,2....,9表示,0存放最近复制的内容,1存放最近删除内容。当新的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享
vim查看二进制文件
1.以二进制方式打开文件
vim -b file
注查看文件格式:hecdump -C file
2.扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
3.编辑二进制文件
4.扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
5.保存退出
可视化模式:
vim 打开一个文件后以块的方式选择字符:
按v:面向字符来选择
按V:面向行来选择
按ctrl-v: 面向块
选择出来的字符段可以被删除x,复制y,变更,过滤,搜索,替换等
多文件模式:可以打开多个文件
多文件分割:同时打开多个文件窗口
vim -o|-O file1 file2
-o:水平分割
-O:垂直分割
切换窗口:ctrl+w
单文件窗口分割:将一个大文件作切割,方便参考文件尾修改文件首部内容
ctrl+w,s:split ,水平分割
ctrl+w,v:vertical,垂直分割
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出
定制vim的工作特性
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
扩展模式:当前vim进程有效
(1) 行号
显示:set number,简写set nu
取消显示:set nunumber,简写set nonu
(2)忽略字符大小写
启用:set ic
不忽略:set noic
(3)自动缩紧
启用:set ai
禁用:set noai
(4)智能缩紧
启用:smartindent 简写set si
禁用:set nosi
(5)高亮搜索
启用:set hlsearch
禁用:set nohlsearch
(6)语法高亮
启用:syntax on
禁用: syntax off
(7)显示Tab和换行符^I 和$显示
启用:set list
禁用:set nolist
(8)文件格式:将win中的文件和unix的文件格式互相转换
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写:set ff=dos|unix
(9)设置文本宽度
启用:set textwidth=65(vim only 距离左边65个字符)
禁用:set wrapmargin=15(距离右边15个字节)
(10) 设置光标所在行的表识线
启用:set cursorline,简写cul
禁用:set no cursorline
(11)复制保留格式
启用:set paste
禁用:set nopaste
set帮助:
help option-list
set or:set all
vim/vi 中内置帮助
:help
:help topic
Use:q to exit help
vimtutor :vim说明书
shell脚步编程基础
程序:指令+数据
程序编程风格:
过程式:以指令为中心,数据服务于指令,例shell
对象是:以数据为中心,指令服务于数据(不关心过程,只关心结果),例python
shell程序:提供了编程能力,解释式执行(shell脚本一条一条命令做翻译后执行)
编程逻辑处理方式:
顺序执行
循环执行
选择执行
shell编程就是过程式的,解释执行
编程语言的基本结构
各种系统命令的组合
数据存储:变量,数组
表达式: a+b
shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制,标明shell类型 #!/bin/bash #!/usr/bin/python
shell脚本的用途有:自动化常用命令,执行系统管理和故障排查,创建简单的应用程序,处理文本或文件
第一步:使用文本编辑器创建文本文件
第一行必须包括shell声明序列:#!/bin/bash
添加注释:注释以#开头
第二步:运行脚步
给予执行权限,在命令行上指定脚本的绝对路径或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行
脚本规范:
脚本代码开头约定
1.第一行一般为调用使用的语言
2.程序名,避免更改文件名后无法找到正确的文件
3.版本号
4.更改后的时间
5.作者相关信息
6.该程序的作用,及注意事项
7.最后是各版本的更新简要说明
bash语法检查:bash -n
bash跟踪执行:bash -x
删除变量:unset 变量名
只读变量:只能声明,但不能修改和删除
声明只读变量:readonly name declare -r name
查看只读变量:readonly -p
查看所有只读变量:declare -p
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1,$2,....:对应脚本中定义的第1个,第2个等参数,shift [n]换位置
$0: 显示命令本身
$*: 显示传递给脚本的所有参数,全部参数合为一个字符串
$@: 显示传递给脚本的所有参数,每个参数为独立字符串
$#: 显示传递给脚本的参数的个数
$@ $* 只有被双引号包起来的时候才后有差异
set -- 表示清除所有位置变量
tee:跟在管道符后,意思为前面执行的命令结果即保存到后面的文件中,也输出到屏幕上
退出状态:
进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败
$? 变量保存最近的命令退出状态
退出状态码:
bash自定义退出状态码
exit[n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止提出状态取决于exit命令后面的数字
注意:若整个脚本中未指定退出状态码,则整个脚本状态取决于脚本中执行的最后一条命令的状态码
算数运算
bash中的算术运算:help let
+,-,*,/,%(取余),**(乘方)
算术运算实现方式:
(1) let var =算术表达式
(2) var = $[算术表达式]
(3) var = $((算数表达式))
(4) var=$(expr arg1 arg2 arg3...)
(5) declare -i var = 数值
(6)echo '算术表达式' | bc
增强型赋值:+=,-+,*=,/=,%=
let varOPERvalue
例如:let count+=3 自加3后自赋值
自增,自减:
let var+=1 例:let i+=3 与 let i=i+3 相等
let var++ 相当于var+1=var 递增1
let var-=1
let var--
乘法符号有些场景中需要转译,如*
bash有内建的随机数生成器:$RANDOM(0-32767)
echo $[$RANDOM%50]:表示0-49之间随机数
逻辑运算:与,或,非
true 1 , false 0
与:
1与1=1
1与0=0
0与1=0
0与0=0
或:
1或0=1
1或1=1
0或1=1
0或0=0
非:!
!1=0
!0=1
短路运算:跳过不执行的场景使用
短路与:表示方法 &&
第一个为0,结果必定为0
第一个为1,第二个必须要参与运算
命令1 短路与 命令2的场景判断:
如果命令1为假,将不执行命令2
如果命令1为真,将执行命令2
短路或:表示方法 ||
第一个为1,结果必定为1
第一个为0,第二个必须要参与运算
命令1 短路或 命令2 的场景判断:
如果命令1为假,将执行命令2
如果命令1为真,将不执行命令2
例:grep -q nginx /etc/passwd && echo root is true || echo toor is not
ping -c1 172.18.233.333 &> /dev/null && echo the host up || echo the host down
异或:^
异或的两个值,相同为假,不同为真 ,异或运算两取值二进制计算
例:对a,b变量做异或运算,交换a,b变量值
a=5;b=6;a=$[a^b];b=$[a^b];a=$[a^b];echo $a ;echo $b
条件测试:
注:中括号中引用变量时最好加上双引号,否则在做非空判断时会出错
若真,则返回0
若假,则返回1
测试命令表示方法(以下都是等价写法,只有在使用正则表达式时才使用双括号):
test命令: test EXPRESSION
一个中括号表示: [ EXPRESSION ]
两个中括号表示: [[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符 ,双括号可支持正则表达式
例:判断str1和str2的值是否相同
str1=123;str2=abc;[ $str1 = $str2 ] ;echo $?
例:判断是否为空,空则执行操作
path = /app
[ "x$path" = "x" ] && rm -rf $path/*
例:若为空值返回真; -z
[ -z "$var" ] && echo true || echo false
若为空值返回假; -n
[-n "$var" ] && echo true || echo false
例:双中括号正则表达式用法
匹配一个字符: var=a;[[ "$var" =~ . ]] && echo true || echo false]
匹配多个字符: var=a;[[ "$var" =~ .* ]] && echo true || echo false]
例:判断文件是否时shell文件
filename=f1.sh ; [[ "$filename" =~ \.sh$ ]] && echo true || echo false
判断变量是否有值:
-v var
数字比较:(不能是字符做比较)
等于:-eq
不等:-ne
小于:-lt
大于:-gt
大于等于:-ge
小于等于:-le
例:判断比较用户的输入是否有参数,没有就直接退出exit不向下执行
[ $# -ne 1] && echo "The arg must one" && exit 20
存在性测试:
-a FILE :同-e
-e FILE :文件存在性测试,存在为真,否则为假
例:判断文件是否存在
[ -e /etc ] && echo true || echo false
bash的存在性及类别测试:
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE或-L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试:
-r FILE:是否存在且可读
-w FILE:是否存在且可写
-x FILE:是否存在且可执行
文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
文件大小测试:
-s FILE:是否存在且非空
文件是否打开:
-t fd:fd文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读写之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
bash的字符串测试:
== 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配
注意:此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING" 变量是否为空判断
-n "STRING"
bash的组合测条件
第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
!COMMAND 非
如:[[ -r FILE1 ]] && [[ -w FILE2 ]]
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
!EXPRESSION 非
必须使用条件测试命令
如:[ -r FILE1 -a -w FILE2 ] && echo true
使用read命令来接受输入
使用read来把输入值分配给一个或多个shell变量
-p 指定要显示的提示
-s 静默输入,一般使用密码
-n N指定输入的字符长度N
-d ‘字符’ 输入结束符
-t N TIMEOUT为N秒
read 从标准输入中读取值,给每个单词分配一个变量
所有剩余单词都被分配给最后一个变量
read -p "Enter a filename:" FILE
如:read -p "please input your name :" name && echo "your name is " $name
bash运行命令优先级
把命令行分成单个命令词
展开别名
展开大括号的声明 ({})
展开波浪符声明 (~)
命令替换$() 和 ``)
再次把命令行分成命令词
展开文件通配(*,?,[abc]等等)
准备I/O重导向(<,>)
运行命令
防止扩展
反斜线 (\)会使随后的字符按原意解释
加引号来防止扩展
单引号(')防止所有扩展
双引号(")也防止所有扩展,但是以下情况例外:
$ 变量扩展
` 命令替换
\ 禁止单个字符扩展
! 历史命令替换
bash退出任务
保存在~/.bash_logout文件中(用户)
在退出登录shell时运行
可用于:在退出同时创建自动备份 或 清除临时文件
echo命令:
选项:
-e:开启转译
-n:表示不换行输出
常用转译符:
\b:转译后相当于按退格键,但前提是\b后存在字符
\c:不换行输出
\n:换行输出
\f:换行,但是换行后新行的开头位置连接着上一行的行尾,阶梯式显示
\v:与\f相同
\t:插入tab,即制表符
\r:光标移至行首,但不换行,相当于\r后的字符掩盖前面的字符
\\:表示插入\本身
tar工具
(1)创建归档(打包)
tar -c -f /PATH/TO/SOMEFILE.tar FILE
(2)追加文件至归档;不支持对压缩文件追加
tar -r -f /PATH/TO/SOMEFILE.tar FILE
(3)查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(4)展开归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/
(5) 结合压缩工具实现:归档并压缩
-j:bzip2, -z:gzip, -J:xz
-T选项指定输入文件,(将要打包的文件夹路径写在一个文件里,执行批量打包)
-X选项指定包含要排除的文件列表(将不需要打包的文件路径写到一个文件里,在运行文件时不执行打包)
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
分隔大的tar文件为多份小文件:
split -b Size -d tar-file-name prefix-name
split -b 1M -d mybackup.tgz mybackup-parts (-d 表示每块文件的前缀名后自动写上数字编号)
split -b 1M mybackup.tgz mybackup-parts (表示被切分的每块文件后标上字母为编号)
合并:
cat mybackup-parts* > mybackup.tar.gz
cpio命令:
功能:复制文件从 或到 归档
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以".cpio"或者 ".tar"结尾的文件
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名
选项:
-o 将文件拷贝打包成文件或者将文件输出到设备
-i 解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式
压缩/解压缩
compress/uncompress 压缩/解压缩
自动生成带后缀名的压缩文件
compress [-dfvcVr][-b maxbits][file...]
-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不删除原文件
-v 显示详情
uncompress 解压缩
zcat:不显示压缩的前提下查看文本文件内容
解压缩:zcat file.Z > file
gzip/gunzip
用法:gzip[option]...file...
-d:解压缩,相当于gunzip
-c:将压缩或解压缩的结果输出至标准输出
-#:1-9,指定压缩比,值越大压缩比越大
bzip2/gunzip2
用法:bzip2[option]...file...
-k: keep,保留原文件
-d:解压缩
-#:1-9,压缩比,默认为9
bzcat:不显示压缩的前提下查看文本文件内容
xz/unxz/xzcat
-k:keep,保留原文件
-d:解压缩
-#:1-9,压缩比,默认6
zip/unzip
打包压缩
zip -r newfile /etc/file/ 可以压缩文件夹
解包压缩
unzip -p message.zip > newfile
shell脚本编程进阶
过程式编程语言:顺序执行,选择执行,循环执行
if语句:
条件选择if语句:是选择执行
注意:if语句可嵌套使用
单分支
if 判断条件;then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1;then
条件为真的分支代码
elif 判断条件2;then
条件为真的分支代码
elif 判断条件3;then
条件为真的分支代码
else
以上条件都为假时的分支代码
fi
逐条件进行判断,第一次遇为真条件时,执行其分支,而后结束整个if语句
case语句
case支持glob风格的通配符:
*:任意长度的任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
a|b:a或b
格式:
case变引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
示例:
read -p "please input a number: " num
case $num in
1|2|3)
echo 1,2,3
;;
4|5|6)
echo 4,5,6
;;
7|8|9)
echo 7,8,9
;;
esac
循环
循环执行:
将某代码段重复运行多次
重复运行多少次:
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
实现循环的语句:for,while,until
1.for循环
for 变量名 in 列表;do
循环体
done
执行机制:依次将列表中的元素赋值给“变量名”;每次循环后执行依次循环体;直到列表中元素耗尽,循环结束
列表生成方式:
(1)直接给出列表:for i in 1 2 3 4 ;do echo i=$i ;done
(2)整数列表:
(a){start..end}
(b)$(seq [start [step]] end)
(3)返回列表的命令
$(COMMAND)
(4)使用glob,如:*.sh
(5)变量引用:$@,$*
例:
所有偶数相加:sum=0;for i in {2..100..2};do let sum+=i ;done;echo $sum
1-100相加:sum=0;for i in {1..100};do let sum+=i ;done;echo $sum
2.while循环
【直到条件为真了进入循环】
while CONDITION; do
循环体
done
(1)CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,
则执行一次循环;直到条件测试状态为“false”终止循环
(2)因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
(3)进入条件:CONDITION 为true时
(4)退出条件:CONDITION 为false时
例:read -p "please input ip(eg:192.168.0.0):" ip
a=`echo $ip |cut -d. -f1-3`
i=1
up=0
down=0
while [ "$i" -le 10 ]
do
ping -c1 -w1 $a.$i &>/dev/null && { echo $a.$i is up ; let ++up ; } || { echo $a.$i is down ; let down++; }
let i=i+1
done
wait
echo UP host is $up
echo DOWN host is $down
注:上述例子中++up和up++是有区别的虽然效果一样,但执行结果不同,在此例中应该为++up,原因是赋值顺序不同导致,i++是先赋值再自增,++i是先自增再赋值
|| 或语句,条件1为假则执行条件2,反之亦然
&& 与语句,条件1为真则执行条件2,反之亦然
while特殊用法:
while循环的特殊用法(遍历文件的每一行):
while read line;do
循环体
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line
练习:扫描/etc/passwd文件每一行,如发现GECOS(备注信息段)字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。
while read line;do
comment=`echo $line | cut -d: -f5`
username=`echo $line | cut -d: -f1`
[ -z "$comment" ] && chfn "$username" -f"$username" -p 62985600 &>/dev/null && echo "$username is motified"
done < /etc/passwd
3.until循环
【直到条件为真了退出循环,为假时进入循环】
until CONDITION;do
循环体
done
进入循环:CONDITION 为false
退出条件:CONDITION 为true
4.循环控制语句continue
用于打破循环,干预循环,本次循环结束,后面的循环继续执行
continue[N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第一层
while CONDTIITION1;do
CMD1
...
if CONDITION2;then
continue
fi
CMDn
...
done
例:for i in {1..10}
do
[ $i -eq 5 ] && continue #当i等于5时执行continue,即跳过5打印其它数字
echo $i
done
例2:for i in {1..10}
do
for j in {1..10}
do
[ $j -eq 5 ] && continue 2 #提前结束第2层循环,打印结果为打印1-4重复10遍
echo $j
done
done
5.循环控制语句break
用于循环体中,提前结束循环,后面的循环不再执行
break [N]:提前结束第N层循环,最内层为第1层
while CONDTIIYION1;do
CMD1
...
if CONDITION2;then
break
fi
CMDn
....
done
例1:for i in {1..10}
do
[ $i -eq 5 ] && break
echo $i
done
例2:
for i in {1..10}
do
for j in {1..10}
do
[ $j -eq 5 ] && break #跳过这一次循环不打印,而其它循环继续执行,打印结果1-4重复10遍
echo $j
done
done
总结:continue语句和break语句有时实现的结果相同但实现方法不同
1.continue语句是跳过此设定的循环,后面的循环继续执行
2.break是停止设定的循环,后面的循环不再执行
3.但在上述两个例2中,不同语句实现的结果相同,但过程不同,continue语句在跳过循环后循环体后面的语句不会继续执行,而break语句在跳过2层循环体时,循环体后面的语句会继续执行
4.break是停止循环体2,循环体2下面的语句还是会执行
5.continue是跳过循环体2,跳过10次,导致循环体后面的其他语句不会执行
6.select循环与菜单
select variable in list
do
循环体命令
done
1)select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3提示符,等待用户输入
2)用户输入菜单列表中的某个数字,执行相应的命令
3)用户输入被保存在内置变量REPLY中
4)select是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可按ctrl+c退出循环
5)select经常和case联合使用
6)与for循环类似,可以省略in list,此时使用位置参量
特殊用法:
1)双括号方法,即((...))格式,也可以用于算数运算
2)双括号方法也可以使用bash shell实现c语言风格的变量操作(help for查看帮助)
I=10
((I++))
例1:for ((sum=0,i=1;i<=100;i++));do let sum+=i;done;echo sum=$sum
例2: sum=0;for i in {0..100..3};do let sum+=i;done;echo sum=$sum
例3: sum=0;i=0;while [ $i -le 100 ];do let sum+=i;let i+=3;done;echo sum=$sum
例4: for ((i=1;i<=9;i++));do for ((j=1;j<=i;j++));do echo -ne "${j}x${i}=$[$j*$i]\t";done;echo;done
3)for循环的特殊格式:
for((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
4)控制变量初始化:仅在运行到循环代码段时执行一次
5)控制变量的修正表达式:每轮循环结束会进行控制变量修正运算,而后再做条件判断
例1:select menu in yxrs kbjd lamian ;do echo $menu ;done
例2:PS3="please choose the menu number:";select menu in yxrs kbjd lamian ;do echo $menu ;done
注:PS3是专门用做定义提示信息的变量,PS2是定义多行重定向中的多行提示符的变量
例3:选择菜单
PS3="please choose the menu number:"
select menu in gbjd yxrs hsdy baoyu quit;do
# $REPLY变量表示将 case $REPLY in
用户输入保存至其中 1|2)
echo the price is 25
;;
3)
echo the price is 20
;;
4)
echo the price is 200
;;
5)
break
;;
*)
echo "try choose again"
;;
esac
done
7.信号捕捉trap
1)trap ‘触发指令’信号
自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
2)trap ''信号
忽略信号的操作
3)trap '-'信号
恢复原信号的操作
4)trap -p
列出自定义信号操作
解释:就是在脚本执行过程中,终端如果发出某种脚本定义了的信号就执行某种操作,也叫做捕获该信号
例:
trap 'echo do not break' 15 #如果终端给出暂停也就是15信号,就打印冒号中的话并且不执行15暂停操作,而是继续执行下面的循环
trap -p #打出上一行的定义内容
for i in {1..10};do
echo $i
sleep 1
done
trap '' 15
trap -p
for i in {11..20};do
echo $i
sleep 1
done
trap '-' 15
trap -p
for i in {21..30};do
echo $i
sleep 1
done
trap -p
8.函数介绍
1)函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程
2)它与shell程序形式上是相似的,不同的时它不是一个单独的进程,不能独立运行,而是shell程序的一部分
3)函数和shell程序比较相似,区别在于:
shell程序在子shell中运行
而shell函数在当前shell中运行,因此在当前shell中,函数可以对shell
中变量进行修改
4)函数相当与别名,别名中包括一系列命令,在调用时只需要用函数名即可实现功能
5)定义函数
# 函数由两部分组成:函数名和函数体
# help function
# 语法一:建议写法
f_name () {
...函数体...
}
# 语法二:
funtion f_name {
...函数体...
}
# 语法三:
function f_name () {
...函数体...
}
例:
[luojie@01:11:29:~/data]function f_cp () { #定义函数
> cp /Users/luojie/data/cut{,.bak}
> cp /Users/luojie/data/ip.txt{,.bak}
> }
[luojie@01:12:50:~/data]f_cp #运行函数
6) 查看定义的函数:declare 或者 declare -f
7) 删除函数:unset 函数名
8) 函数定义后是放在内存中的,退出就失效了,属于临时定义
9)在脚本中函数需要先定义再调用
10)函数的定义和使用:
可在交互式环境下定义函数
可将函数放在脚本文件中作为它的一部分
可放在只包含函数的单独文件中
调用:函数只有被调用才会执行
调用:给定函数名
函数名出现的地方,会被自动替换为函数代码
函数的生命周期:被调用时创建,返回时终止
11) 函数也支持位置参数定义
例如:
redyel () {
#这里对函数调用时 if [ "$1" = "-r" ];then
#后面的位置参数做例判断 echo -en "\033[41m \033[0m"
echo -en "\033[43m \033[0m"
else
echo -en "\033[43m \033[0m"
echo -en "\033[41m \033[0m"
fi
}
for i in `seq 1 $maxi`
do
for j in `seq 1 $maxj`
do
if [ $j -le $halfj ]
then
#这里函数调用时带了-r位置参数(也可以为任意字符) redyel -r
else
redyel
fi
if (( $j%$maxi == 0 ));then
echo
fi
done
12)函数直接或间接调用自身叫做递归,导致没有处理完的函数数量不断积累,内存不断增加,直至进程崩溃
例:fun () {let i++;echo $i;fun;} && fun
函数递归示例:fact.sh
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ];then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1
13)fork炸弹
fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,实质是一个简单的递归程序。
由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源
函数实现:
:(){ :|:& };" 冒号就是函数名
bomb() { bomb | bomb & }; bomb
脚本实现:
cat Bomb.sh
#!/bin/bash
./$0|./$0& #$0就脚本自己
14) local本地变量,用与函数中,意思为仅在本函数中使用一次变量,而其他地方不能使用该变量
例:如下这里的变量n只在test函数中被引用,除了这个函数外不再被引用
test(){ locat n=300;echo $n}
15) 加载函数:source 函数路径
环境函数:将函数定义为环境函数可以将父shell中定义的函数被子shell调用
定义方法:export -f funcname
此时function函数就能被其他shell所调用生效
自定义一个开机自动启动的服务:
方法一:
1.创建服务脚本,例如下面函数练习题5,自定义一个服务脚本放在/etc/init.d/目录下
2.在脚本中必须定义chkconfig项,即备注该服务要运行在那种模式下,运行或停止时的文件名称以那个数字开头做代表
3.chmod +x 给定该服务脚本执行权限
4.现在就可以service start 该服务了
5.现在就可以在/etc/rc3.d/ (或者脚本中定义的启动模式)路径下找到该服务了
6.可以利用chkconfig命令来管理该自定义服务了
方法二:
1.如果不想重新创建脚本的方式来启动服务,也可以在每个启动模式下/etc/rc{2,3,4,5}.d/s99local 文件中定义
2.可以发现所有的s99local文件都是一个连接文件到/etc/rc.local 的文件
3.也可以直接在该文件中编写开机自动执行的服务脚本
示例:自动挂在nfs共享文件系统
文件系统自动挂载通常是写在/etc/fstab文件中来实现开机自动挂载,但是使用fstab在系统开机时会进行自检,如果磁盘或文件系统存在异常,
就会导致自检无法通过,一直卡在开机界面,无法正常启动,因此针对nfs这类网络文件系统,一般是放在/etc/rc.local里面来实现开机自动挂载
先安装nfs工具集:yum install nfs-utils -y
vim /etc/rc.local
#mount NFS
mount -t nfs -o vers=3,timeo=600,nolock sfs-nas01.ap-zahkjja-1.hkza2.com:/share-xxx /NFS
chmod +x /etc/rc.d/rc.local
chkconfig命令:
1.查看服务在所有级别的启动或关闭设定情形:chkconfig [--list][name]
2.添加:SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig --add name
#!/bin/bash
#LLLL表示初始在那个级别下启动,- 表示都不启动
#chkconfig:LLLL nn nn
删除:chkconfig --del name
修改指定的链接类型:chkconfig [--level levels] name <on|off|reset>
--level LLLL :指定要设置的级别;省略时表示2345
linux centos启动流程:
总结:/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本,完成系统初始化
--> (关闭对应下需要关闭的服务)启动需要启动的服务 --> 设置登录终端
centos6 启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs --> switchroot
--> /sbin/init --> (/etc/inittab,/etc/init/*.conf) -->设定默认运行级别 --> 系统初始化脚本rc.sysinit
--> 关闭或启动对应级别的服务 --> 启动终端
判断一个服务进程是否存在的方法:
1.killall -0 httpd ;echo $? 为0则存在
2.ps -ef | grep httpd | grep -cv grep 为0则不存在
lastb 命令,查看连接本机失败的ip地址
踢掉一个用户登录:pkill -u test -9
查看一个命令所依赖的库文件
ldd /bin/ls
11-5看完
练习题/面试题
函数练习:
1.编写函数,实现OS的版本判断
osversion() {
echo `sed -r "s/.* ([0-9]\..*)/\1/" /etc/centos-release`
}
2.编写函数,实现取出当前系统eth0的IP地址
ip_func() {
echo `ifconfig eth0 | sed -rn 's/inet (.*) netmask .*/\1/p'`
}
3.编写函数,实现打印绿色OK和红色FAILED
# . /etc/init.d/functions #加载函数集
# action "the service is failed" #调用函数集中的action函数
the service is failed [ 确定 ]
#action "the service is failed" flase
the service is failed -bash: flase: 未找到命令
[失败]
4.编写函数,实现判断是否无位置参数,如无参数,提示错误
weizhi() {
if [[ -z $1 ]];then
echo "kong"
else
echo "not kong"
fi
}
5.编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1)脚本可接受参数:start,stop,restart,status
(2)如是参数非此四者之一,提示使用格式后报错退出
(3)如是start:则创建/var/lock/subsys/SCRIPT_NAME,并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4)如是stop:则删除/var/lock/subsys/SCRIPT_NAME,并显示“停止完成”
考虑:如果事先已经停止过了,该如何处理?
(5)如是restart,则先stop,再start
考虑:如果本来没有start,如何处理?
(6)如是status,则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT——NAME isrunning。。。”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped...”
其中:SCRIPT_NAME 为当前脚本名
(7)在所有模式下禁止启动该服务,可用chkconfig和service命令管理
在这个目录下才能用service命令管理
vim /etc/init.d/testsrv
#chkconfig: 35 96 3 #这一项是必须写,这样才是一个service服务,表示在35启动模式下运行,rc3.d目录下文件已S96开头的启动文件,以K开头的文件则以3开头的停止文件
#description: test service #服务解释,建议要有
#借调该函数,使其实现带颜色的“启动成功”和“停止启动”
source /etc/init.d/functions
a="/var/lock/subsys/testsrc"
start_fun() {
[ -f "$a" ] && action "testsrv is started"
touch "$a"
action "启动成功"
}
stop_fun() {
[ ! -f "$a" ] && action "testsrv is stoped"
rm -rf "$a"
action "停止启动"
}
restart_fun() {
stop_fun
start_fun
}
status_fun() {
if [ -f "$a" ] ;then
echo "SCRIPT_NAME is running...."
else
echo "SCRIPT_NAME is stopped...."
fi
}
case $1 in
start)
start_fun
;;
stop)
stop_fun
;;
restart)
restart_fun
;;
status)
status_fun
;;
*)
echo "no no no ! ! !"
exit
;;
esac
chmod +x /etc/init.d/testsrv
service testsrv start 就能正常运行
#实现chkconfig管理
chkconfig --add testsrv
chkconfig --list testsrv
chkconfig --level 5 testsrv off 此时tetssrv文件在rc5.d目录下就有了以K3开头的停止文件
chkconfig -del testsrv
6.编写脚本/root/bin/copycmd.sh
(1)提示用户输入一个可执行命令名称
(2)获取此命令所依赖到的所有库文件列表
(3)复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
如:/bin/bash ==》 /mnt/sysroot/bin/bash
/usr/bin/passwd ==〉/mnt/sysroot/usr/bin/passwd
(4)复制此命令依赖到的所有库文件至目标目录下的对应路径下:
如: /lib64/ld-linux-x86-64.so.2 ==>
/mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出
dst=/mnt/sysimage
if [ ! -e "$dst" ] ; then
mkdir -pv $dst
fi
my_cp() {
local src=$1
local dst=$2
local dir=`dirname $dst`
if [ ! -e $dir ] ; then
mkdir -pv $dir
fi
\cp -a $src $dst
}
#\cp表示运行原始的cp命令,但脚本中是不执行别名命令的,所以加不加斜线都运行的原始cp命令
while true; do
read -p "enter you cmd: " short_cmd
if [ "$short_cmd" == "quit" -o "$short_cmd" == "q" ] ; then
exit 0
fi
short_cmd=`basename $short_cmd`
long_cmd=`which --skip-alias --skip-functions --skip-dot --skip-tilde $short_cmd ` &> /dev/null
#cp bin
my_cp $long_cmd $dst$long_cmd
#cp lib
for lib in `ldd $long_cmd | egrep -o "/[^[:space:]]+ " ` ; do
echo -e "\n$lib\n"
my_cp $lib $dst$lib
done
# cp man
#for man in `man -aw $short_cmd` ; do
# my_cp $man ${dst}${man}
#done
done
脚本:
1.每个3秒钟到系统上获取已经登录的用户信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本
while true ;do
a=`w -h|cut -d" " -f1 | grep hacker`
if [[ ! -z $a ]];then
echo "`date +%F@%T` hacker is login " >> login.txt
break
else
sleep 3s
fi
done
2.随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
read -p "please input number:" num
a=`echo $[$RANDOM%10]`
while [[ "$num" -ne "$a" ]];do
if [ "$num" -lt "$a" ];then
read -p "less than rendom:" num
else
read -p "much than random:" num
fi
done
echo okkkkk
3.用文件名做参数,统计所有参数文件的总行数
find /etc/ -type f > wenjian.txt
while read line;do
a=`wc -l $line`
echo $a >> b.txt
done < wenjian.txt
cat b.txt | cut -d" " -f1 > c.txt
echo $(echo -n `cat c.txt` |tr " " + )|bc
#方法二
#cat c.txt | awk '{sum+=$1} END {print sum}'
4.用二个以上的数字为参数,显示其中的最大值和最小值
脚本:while实现
1.将lastb中最近100条记录中失败次数超过5次的ip连接(如果此ip已经被拒绝,就不要重复拒绝)
lastb | tr -s " " : | cut -d: -f4 | sort |uniq -c | sort -r | head -10
2.while语句批量删除用户
方法一:
while read line;do
username=`echo $line|cut -d:f1`
echo $username | grep -qE "^user[0-9]+$" && userdel -r $username && echo $username is removed
done < /etc/passwd
while语句获取当前连接数超过10的IP地址使其拒绝连接
方法一:
time=30
while true
do
ss -nt | grep ESTAB |tr -s " " :| cut -d: -f6|sort |uniq -c | while read num ip
do
if [[ $num -ge 10 ]];then
iptables -A INPUT -s '$ip' REJECT
fi
done
sleep $time
done
方法二:
time=30
while true ;do
ss -nt | grep ESTAB | tr -s " " : | cut -d: -f6 | sort |uniq -c > /root/data/num_ip.txt
while read num ip;do
if [[ $num -ge 1 ]];then
iptables -A INPUT -s '$ip' REJECT
fi
done < /root/data/num_ip.txt
sleep $time
done
3.编写脚本,求100以内所有正奇数之和
方法一:
i=1
sum=0
while [ $i -le 100 ]
do
let sum=sum+i
let i+=2
done
echo $sum
方法二:
for i in {1..100..2};do let sum+=i;done ;echo $sum
4.编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少
5.编写脚本,打印九九乘法表
6.编写脚本,利用变量RANDOM生成10个随机数字,输出这10个数字,并显示其中的最大值和最小值
i=1
while [ "$i" -le 10 ];do
num=`echo $RANDOM`
echo $num
if [ "$i" = 1 ];then
max=$num
min=$num
else
if [[ $num -gt $max ]];then
max=$num
elif [[ "$num" -lt "$min" ]];then
min=$num
fi
fi
let i++
done
echo "The max is $max"
echo "The min in $min"
7.编写脚本,实现打印国际象棋棋盘
8.后续六个字符串:a782e8aa4c,bc73550eeb,ac2e084d67,34a1d97244,941b1a699e,ccc1b4b1a0 是通过对随机数变量RANDOM随机执行命令:
echo $RANDOM|md5sum|cut -c1-10 后的结果,请破解这些字符串应的RANDOM值
方法一: i=0
while [ $i -le 32767 ];do
a=`echo $i | md5sum|cut -c1-10`
if [[ "$a" =~ "a782e8aa4c" ]];then
echo "okkkkkk a782e8aa4c is $i "
elif
[[ "$a" =~ "bc73550eeb" ]];then
echo "okkkkkk bc73550eeb is $i "
elif
[[ "$a" =~ "ac2e084d67" ]];then
echo "okkkkkk ac2e084d67 is $i "
elif
[[ "$a" =~ "34a1d97244" ]];then
echo "okkkkkk 34a1d97244 is $i "
elif
[[ "$a" =~ "941b1a699e" ]];then
echo "okkkkkk 941b1a699e is $i "
elif
[[ "$a" =~ "ccc1b4b1a0" ]];then
echo "okkkkkk ccc1b4b1a0 is $i "
fi
let i++
done
方法二:
i=0
while [ $i -le 32767 ];do
rand=`echo $i | md5sum | cut -c1-10`
case $rand in
a782e8aa4c)
echo $i md5 a782...
;;
bc73550eeb)
echo $i md5 bc7355...
;;
ac2e084d67)
echo $i md5 ac2e...
;;
34a1d97244)
echo $i md5 34a1....
;;
941b1a699e)
echo $i md5 941ba...
;;
ccc1b4b1a0)
echo $i md5 ccc...
;;
esac
let i++
done
脚本:用for实现:
1.判断/var/目录下所有文件类型
思路:将ls查询的结果用sed拼接上基名,然后利用for循环执行,并且执行file命令查询文件类型
a=`ls /var/ | sed -r 's@(.*)@/var/\1@'`
for i in $a ;do
file $i
done
2.添加10个用户user1-user10,密码为8位随机字符
思路:用for循环生成10个用户并创建,将随机数设置为密码--stdin(命令行管道接受密码)
#变量赋值时等号附近不能有空格,否则空格也会记为字符纳入变量中
#passwd --stdin 意思是接受来自标准输入或管道的密码,只有root可以使用
for i in {1..5} ;do
user=new$i
useradd $user
passwd=`openssl rand -base64 100| head -c8`
echo $passwd | passwd $user --stdin
echo $user $passwd >> d.txt
done
3./etc/rc.d/rc3.d目录下分别有多个以k开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以s开头的输出为文件名加start。如k34filename stop S66filename start
思路:将路径ls结果赋值给变量a,for循环a次,if语句判断是否是S开头的文件,是则sed添加start,else则添加stop
a=`ls /etc/rc.d/rc3.d/`
for i in $a ;do
if [[ "$i" =~ ^S.*$ ]];then
echo $i |sed -r 's@'"$i"'@'"$i"' start@'
else
echo $i |sed -r 's@'"$i"'@'"$i"' stop@'
fi
done
4.编写脚本,提示输入正整数n的值,计算1+2+...+n的总和
思路:语句判断输入是否是大于0的正整数,然后for循环执行用户输入的数位次数,然后做加法
方法一:seq 10 | tr "\n" + | sed 's/\+$//' |bc
方法二:sum=0;for i in {1..100};do let sum=sum+i;done;echo $sum
read -p "Please input Positive integer :" num
[[ ! "$num" > 0 ]] && echo "=========input error ========" && exit 10
sum=0
for i in `seq 1 $num` ;do
let sum=sum+i
done
echo $sum
unset sum
5.计算100以内所有能被3整除的整数之和
思路:for循环100次,执行i能否被3整除,满足则做加法运算
方法一:sum=0;for i in {3..100..3};do let sum=sum+i ;done ;echo $sum
方法二:
for i in {1..100};do
var=$[i%3]
if [ $var = 0 ];then
let num+=i
fi
done
echo $num
6.编写脚本,提示请输入网络地址,如192.168.0.0,判断输入网段中主机在线状态
思路:read读取用户输入,cut剪切只取前3个网段,最后一个网段用for循环填充,然后ping命令测试是否在线
read -p "please input ip(eg:192.168.0.0):" ip
a=`echo $ip |cut -d. -f1-3`
for i in {1..255};do
if ping -c1 -w1 $a.$i &>/dev/null;then
echo $a.$i is up >> ip.txt
else echo $a.$i is down
fi
done
wait
7.打印九九乘法表
思路:行数与列数相同
for i in {1..9};do
for j in `seq $i`;do
echo -e "${j} x ${i}=$[j*i]\t\c"
done
echo
done
8.在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如1asdefrgm.html
思路:文件个数取for循环10个,随机生成8为字符,拼接生成文件,tr命令中-c为取反[:alpha:]为大小写字母
for i in {1..10};do echo /app/$i`openssl rand -base64 100|tr -dc '[:alpha:]' |head -8c`.html;done
取八个字符方法:
openssl rand -base64 100 | grep -o '[[:alpha:]]' | head -n8 |tr -d "\n"
openssl rand -base64 100 | sed -r 's/[^[:alpha:]]//g' | head -c8
9.打印等腰三角形
思路:行数为读取read用户输入,等腰三角形的每行空白字符户为n-1,打印*字符数为2n-1
read -p "please input num" num
for i in `seq $num `;do
space=`echo $[num-i]`
for j in `seq $space -1 1`;do
echo -n " "
done
for k in `seq $[2*$i-1]`;do
echo -n "*"
done
echo
done
10.打印国际象棋棋盘
思路:四层嵌套,一次横向和纵向打印四个空白符,循环4次
for num in {1..4};do
for i in {1..4};do
for j in {1..4};do
echo -ne "\033[47m \033[0m"
echo -ne "\033[41m \033[0m"
done
echo
done
for x in {1..4};do
for z in {1..4};do
echo -ne "\033[41m \033[0m"
echo -ne "\033[47m \033[0m"
done
echo
done
done
11.扫描网段开机的ip地址
> ~/data/ip.txt
net=192.168.31
for i in {1..254};do
{
if ping -c1 -W1 $net.$i &> /dev/null;then
echo $net.$i is up
echo $net.$i >> ip.txt
else echo $net.$i is down
fi }&
done
wait
创建100个账号,每个账号都设置一个随机口令
for i in {1..10};do
username=test_user22$i
useradd $username
passwd=`openssl rand -base64 10 | head -c8`
echo $passwd | passwd $username --stdini &> /dev/null
echo $username = $passwd >> passwd.txt
done
echo "finish"
sed命令例题:
1.删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
sed -r 's/^ +//' /etc/grub2.cfg
2.删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
sed -r 's/# +//' /etc/fstab (+至少一个,?0或1个)
3.在centos6系统/root/install.log每一行行首增加#号
sed -r 's/(^.*)/#\1/' /root/install.log
4.在/etc/fstab文件中不以#开头的行的行首增加#号
方法一:cat /etc/fstab | sed -r 's/#//' | sed -r 's/(.*)/#&/'
方法二:sed -r 's/(^[^#].*)/#\1/' /etc/fstab
注:[^#]是正则表达式中匹配在中括号指定范围外的内容,[]中括号则表示在括号范围内的被匹配
5.处理/etc/fstab路径,使用sed命令取出其目录名和基名
echo "/etc/fstab" | sed -r 's@(/.*)(/.*)@\1@'
echo "/etc/fstab" | sed -r 's@(/.*)(/.*)@\2@'
6.利用sed取出ifconfig命令中本机的IPV4地址
方法一(掐头去尾):ifconfig eth0 |sed -n '2p' | sed -r 's/inet//' | sed -r 's/netmask.*//'
方法二(瓮中捉鳖):ifconfig eth0 | sed -n '2p' | sed -r 's/inet(.*)netmask.*/&/'
方法三:inconfig eth0 | sed -rn '2s/inet(.*)netmask.*/\1/p
7.统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
方法一:cat /init.d/Package | rev | cut -d. -f2 | rev | sort | uniq -c
方法二:cat /init.d/Package | sed -rn 's/.*.(.*).*$/&/' | sort |uniq -c
8.统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
方法一:cat /etc/init.d/functions | egrep -io '[a-z]{1,26}' | sort | uniq -c
方法二:sed -r 's@[^[:alpha:]]+@\n@g' /etc/init.d/functions |sort | uniq -c |sort -rn
9.统计/etc/passwd中的shell类型相同的出现了多少次
方法一:cat /etc/passwd |rev | cut -d: -f1 |rev | sort | uniq -c
方法二:cat /etc/passwd | sed -rn 's/.*:(.*)$/\1/p' | sort |uniq -c
10.给/etc/nginx/nginx.conf文件中不是以没有#号开头的行加上#号注释
sed -r 's/(^[^#].*)/#\1/' /etc/nginx/nginx.conf
sed 脚本
1.判断操作系统版本是否为7,是则修改后面文件的内容
#!/bin/bash
a=`sed -nr 's@.*release (.).*@\1@p' /etc/centos-release`
echo $a
[ "$a" = 7 ] &&sed -r 's@("console)@\1 xxx@' /etc/default/grub || exit 20
find命令例题:
1.查找/var目录下属主为root,且属组为mail的所有文件
find /var -user root -group mail
2.查找/var目录下不属于root,lp,gdm的所有文件
find /var ! -user root ! -user lp ! -user gdm -ls
3.查找/var目录下最近一周内其他内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 ! -user root ! -user postfix -ls
4.查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
find -nouser -o -nogroup -atime -7
5.查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc -size +1M -type f
6.查找/etc目录下所有用户都没有写权限的文件
find /etc ! -perm /222 -type f -ls
7.查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -perm /111 -ls
8.查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/init.d/ -perm -111 -a -perm /002 -ls
脚本:任何用户登录系统时,显示红色字体的警示提示信息“hi,dangerous!”
vim /etc/profile.d/danger.sh (在profile.d目录下以.sh结尾即可生效)
echo -e "\033[1;5;31;43mHi,dangerous!\033[0m"
判断输入yes/no
ans=yEs;[[ "$ans" =~ ^[yY]([Ee][Ss])?$ ]] && echo true
ans=n;[[ "$ans" =~ ^[nN][Oo]?$ ]] && echo true
编写脚本/root/bin/excute.sh,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
file=$1
[ -e $file ] && echo $1 "文件已存在" && exit || echo $1 "文件不存在"
[[ $file =~ .sh$ ]] && echo "该文件是bash文件,即将被创建并添加执行权限" && touch $file && chmod +x $file || echo $file "是非脚本文件,不做任何处理"
编写脚本/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统
答:touch /etc/nologin 即可实现此功能,里面可以编辑一些提示信息,不用额外配置
echo Disable common user login > /etc/nologin 拒绝登录时显示
删除此文件即可允许登录
条件测试脚本:编写脚本/bin/per.sh,判断当前用户对指定的参数文件是否不可读并且不可写
[ ! \( -r $1 -o -w $1 \) ] && echo true
或者:[ ! -r /etc/shadow -a ! -w /etc/shadow ] && echo true
统计一个进程打开的文件数
#一个进程每打开一个文件就创建一个fd文件
ls /proc/$$/fd | wc -l
脚本:编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数小于1,则提示用户“至少应该给一个参数”,并且立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数。
cat > /root/bin/argsnum.sh <<EOF
> [[ $# < 1 ]] && echo "至少应该给一个参数" && exit 20
> arg=$1
> a=`cat $arg |wc -l ` && echo "文件$1的总行数为" $a
> b=`grep [^[:blank:]].* $arg | wc -l` && echo "文件$1中有字符的为行" $b
> c=$[a-b] && echo "文件$1中空白行数为" $c
> EOF
或者:grep ^[[:space:]]*$ $1 | wc -l
[[ $# < 1 ]] && echo "至少应该给一个参数" && exit 20
[ -e $1 ] && echo "文件存在空白行数为" `grep '^[[:space:]]*$' $1|wc -l` || echo "文件不存在"
脚本:编写脚本/root/bin/hostping.sh,接受一个主机的ipv4地址作为参考,测试是否可连通。如果能ping通,则提示用户“该ip地址可访问”;否则提示“该ip地址不可访问”
echo a.txt
[[ $# < 1 ]] && echo "至少应该给一个参数" && exit 20
[[ $1 =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] && echo $1 is true || echo $1 is false
ip=$1
ping -c3 -t3 "$ip" ; echo $? > a.txt
[ `cat a.txt` -eq 0 ] && echo $1 "该ip地址可以访问" || echo $1 "该IP地址不能访问"
脚本:编写脚本checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
a=`df -h | grep "/dev/disk.*" | tr -s " " : | cut -d: -f5 | sort -r | head -1 | tr % " "`
[ "$a" -ge 80 ] && echo "警告:磁盘空间达到阈值80%以上" || echo no
或者:
diskNum=`df | grep "/dev/dis" | grep -o "[0-9]*%" | grep -o "[0-9]*" |sort -nr|head -1
inodeNum=`df -i | grep "/dev/sd" | grep -o " [0-9]*% " |grep -o "[0-9]*" | sort -nr |head -1 `
sum=80 #阈值变量
[ "$diskNum" -ge "$sum" ] && echo -e "磁盘空间占用率超过$sum\a `wall 'The disk space will be full.' `"||echo "磁盘空间利用率为:$diskNum,可以使用"
[ "$inodeNum" -ge "$sum" ] && echo -e "inode空间占用率超过$sum\a `wall 'The disk space will be full.' `"||echo "磁盘空间利用率为:$inodeNum,可以使用"
脚本:判断手机号是否正确
mobile=138888888888 ;[[ "$moile" =~ ^1[3456789][0-9]{9}$ ]] && echo true || echo false
脚本:判断是否为正整数
var=0133 ; [[ "$var" =~ ^0*[1-9].*$ ]] && echo true || echo false
var=-122 ; [[ "$var" =~ ^0*[1-9][0-9]*$ ]] && echo true || echo false
脚本:判断是否是纯数字
var=789 ; [[ $var =~ ^[0-9]+$ ]] && echo true || echo false
脚本:判断ip地址是否正确的脚本
ip=$1 ; [[ "$ip" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] && echo $1 is true || echo $1 is false
脚本:随机变化颜色;
设置color变量再引用
color=$[RANDOM%7+31];echo -e "\033[${color}mred color\033[0m"
color=seq 31 37 | sort -R |head -1 ;echo -e "\033[1;5;${color}mred color\033[0m"
正则表达式:取/etc/passwd文件中第10个用户和第20个用户的uid之和
uid1=`head /etc/passwd | tail -1 | cut -d: -f3`
uid2=`head -20 /etc/passwd | tail -n1 | cut -d: -f3`
echo $[uid1+uid2]
脚本:编写脚本/root/bin/backup.sh ,可实现每日将/etc/目录备份到/root/etcyyyy-mm-dd中
[luojie@02:29:24:~/data]cat backup.sh
#!/bin/bash
#Date : 2020-08-19
#File name : backup.sh
echo "backup /etc/passwd home start..."
cp -aR /etc/passwd /Users/luojie/data/passwd+`date +%F`
echo "backup over......."
编写脚本/root/bin/dick.sh,显示当前硬盘分区中空间利用率最大的值
df -h | grep dis | tr -s " " : |cut -d: -f1,5 | head -1
/dev/disk1s1:87%
利用扩展正则表达式分别表示0-9,10-99,100-199,200-249,250-255获取IP地址
ifconfig | egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
取文件路径的基名
echo "/etc/rc.d/init.d/functions" | grep -eo "^/.*/"
取出ip地址(下式解释:取0-9的数字是1到3位的数中间是转译了的.做分隔将前面匹配的数字分组出现3次{3\},最后一位还是前面表述的数字)
ifconfig ens33 | grep -o "\([0-9]\{1,3\}\.\){3\}[0-9]\{1,3\}"
或扩展正则表达式:小括号中的内容为分组,中括号为重复次数
ifconfig ens33 | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
利用df和grep,sort 取出磁盘各分区利用率,并从大到小排序
df | grep "/dev/sd" | grep -o "\<[[:digit:]]\{1,3\}%" |grep -o "[[:digit:]]\{1,3\}" | sort -nr
添加用户bash,testbash,basher,sh,nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
grep "^\(.*\):.*\b\1$" /etc/passwd(先锚定词首为任意字符再\1后向引用前面的搜索结果并且$锚定词尾,而\b表示词尾锚定保证词尾是完整单词)
查找出passwd文件中的系统用户的用户名和uid
cut -d: -f1,3 /etc/passwd | grep "[0-9]\{1,3\}$"
找出“netstat -tan”命令的结果中以'LISTEN' 后跟多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:soace:]]*$"
显示passwd中的两位数或三位数
grep -o "\b[0-9]\{2,3\}\b" /etc/passwd
显示用户rpc默认shell程序
cat /etc/passwd | grep "^rpc\>" | cut -d: -f7
取函数名称
grep -o "^[[:alnum:]_]\+[[:space:]]*()" /etc/init.d/functions
查询centos系统版本
grep -o [[:digit:]] /etc/centos-release | head -n1
grep -o "[0-9]\+" /etc/centos-release | head -n1
查出/tmp的权限,以数字方式显示
stat /tmp | grep uid |cut -d"(" -f2 | head -c4
查出用户UID最大值的用户名,UID及shell类型
sort -n -t: -k3 passwd |tail -n1|cut -d: -f1,3,7
显示访问量最大的ip地址
cut -d " " -f1 /var/log/httpd/access_log | sort |uniq -c |sort -nr |head 10
取出文件中的用户名和uid按uid大小排序
(-d:以:为分隔符 -f1,3取1,3列;sort -nr以数字排倒序 以:为分隔符,-k2取第2列)
cut -d: -f1,3 /etc/passwd |sort -nr -t: -k2
用ifconfig命令取主机IP地址
mac: ifconfig en0 | grep inet" " |cut -d " " -f2
centos6: ifconfig eth0 |head -n2 |tail -n1 |tr -s " " : |cut -d: -f4
centos7: ifconfig ens33 |grep netmask |tr -s " "
生成随机口令:
例生成随机数:openssl rand -base64 30 |head -c30 ;tr -dc '[:alnum:]_' < /dev/urandom | head -c20
文件权限的实验:
1.在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读写权限,其他用户不能访问这个文件夹
创建组
]# groupadd g1
]# groupadd g2
]# groupadd g3
]# mkdir /testdir/dir -pv
]# chgrp g1 /testdir/dir
]# chmod g+s /testdir/dir
]# setfacl -m d:g:g2:rw,d:g:g3:r /testdir/dir
]# chmod o= /tetstdir/dir
实验:删除一个用户(haha)的家目录,然后恢复
1.拷贝家目录家默认隐藏文件到删除的用户下 cp -r /etc/skel /home/haha 注:用户数据是无法恢复的
2.更改此家目录下的所有文件属主和属组为该用户 chown -R haha:haha /home/haha
3. 更改用户家目录的权限,使其仅该用户有权限 chmod 700 /home/haha
例题:创建用户组,并且设置目录组成员可访问设置guid
1. groupadd opts 创建组
2. groupmems -l -g opts 查询组中成员
3. groupmems -a wang -g opts 将用户添加至附加组
4. chgrp opts projectl/ 将工作目录的组改为opts组
5 chmod 770 projectl/ 使该目录的其他用户other无法访问
6 chmod g+s projectl/ 添加sgid,使其用户在该目录下创建的新文件都是该目录的属组,而非用户的相同组,这样可以使在opts组中的用户在此目录下都可以互相修改文件,不然只能删除和看对方文件不能修改
实验:centos6/7上修改/etc/passwd root 的uid为非0,使其无法启动,修复之
启动菜单项--》选择启动内核centos7--》任意键按e--》linux16行,最后加上init=/bin/bash |sh --》ctrl+x-- 》mount -o rw,remount / --》nano /etc/passwd 修正uid --》重启
练习:
luojie@dafeng-mac:~/data]$mkdir -pv ./test4/dir{3,4,5/dir{6,7}}
luojie@dafeng-mac:~/data]$mkdir -pv ./test3/dir{1..5}
luojie@dafeng-mac:~/data]$mkdir -pv ./test2/{x,y}/{a,b}
systemctl enable autofs 开机自启动自动文件系统挂载,创建一块新磁盘时作自动挂载
vim /etc/DIR_COLORS 定义文件目录显示颜色
- linux 文件系统结构
linux文件系统:
FHS文件系统存放标准;
bin 二进制文件
sbin 系统二进制文件
boot 引导系统启动的文件
dev 设备文件(字符文件和块文件)
etc 主机相关的设备配置文件
lib 共享库文件和内核mode
lib64 64位应用共享库文件
media 可移动设备
tmp 临时文件
usr 第三方程序存放目录,最大的目录(编译时的编译目录)
var 可变化的数据
proc 内存中存储的内容
sys 硬件相关的文件,例如磁盘
opt 第三方应用程序的安装目录
mnt 临时文件系统挂载点

浙公网安备 33010602011771号