history |tail -1 | cut -d'' -f2
计算命令:1)let 例;let C=$A+$B
2)C=$[$A+$B]
3)C=$(($A+$B))
4)expr命令 例:C=` expr $A + $B `
退出脚本;exit 例;exit 0
条件测试:
1)[空格 表达式 空格]
2)test 表达式
3)[[ 空格 表达式 空格]]
if grep 'bash' /etc/shadow
if后面为非零值为假
文件测试
-e file 测试文件是否存在
-f file 是否为普通文件
-d file 是否为目录
-r file 当前用户是否有读权限
$0表示当前命令
多分支if
if 判断1 ;then
语句1
elif 判断2; then
语句2
elif 判断3; then
语句3
else
语句4
fi
测试脚本有无语法错误
bash -n 脚本名称
单步执行脚本
bash -x 脚本名称
位置变量
shift 轮换参数内容
特殊变量:
$#:表示参数的个数
$?
$*:表示参数列表
$@:表示参数列表
sed数据流编辑器
sed对文件本身不处理
sed [选项] 'addresscommand'file...
address
1)1,100
2)/regularexpression/
例:/^root/
3)/pattern1/,/pattern2/
第一次被模式一匹配到的行开始到
第一次被模式二匹配到的行结束的
中间的所以行
4)linenumber
指定的行
$表示最后一行
5)startline,+n
从起始行开始的n行(一共n+1行)
command:
d:删除符合条件的行(只是不打印而已)
p:显示符合条件的行(符合的显示两次,不符合的显示一次)
a \string:在指定的行后面追加新行,内容为string
\n:可以用来换行
i \string:在指定的行前面追加新行,内容为string
r file:将指定的文件的内容添加到符合条件的行处
w file:将指定范围内的内容另存到指定文件中(追加的方式)
s/要查找的内容/要替换成的内容/ 查找并替换(默认只替换每行中第一次匹配要被替换的内容)
g:全局替换
i:查找时忽略大小写
&:引用匹配到模式的整个串
后向引用:
例:
sed 's#\(l..e\)#\1r#g' sed.txt
同一目的用&写
sed 's#l..e#&r#g' sed.txt
-n:静默模式,显示结果只和命令相关
-i:直接修改源文件(谨慎使用)
-e 命令1 -e 命令2....:可以同时进行命令1,2....
-f (把每个命令写进文件中)那个文件的路径 :也能同时处理多个命令
-r:使用拓展的正则表达式
for 变量 in 列表
do
循环体
done
如何生成列表
1)(1..10)
2) `seq 10` 等价于1)
seq a b c
a为起始数
b为步进长度
c为结束数
3)引用(``)命令
vim
vim +行号N 文件名:打开文件时直接在N上
vim +文件名:直接处在文件尾部
vim +/pattern 文件名:打开文件定位置
ctrl+f 上翻一屏
ctrl+b 下翻一屏
ctrl+d 下翻半屏
ctrl+u 上翻半屏
删除单个字符:x
n个字符:nx
d是删除命令
d0删除到行首
3dw删除三个单词
3dd删除3行(包含当前光标所在行)
dd删除当前行
末行模式下
/n 表示查找n
:1,9d表示删除第一到第九行
:.,9d删除当前行到第九行
+n表示向下n行
vim如何实现复制粘贴
复制yy
粘贴p
复制y的用法同d的用法
3yy复制三行
修改:先删除内容再自动转换成输入模式
c,c的用法同d命令
替换:r,只能替换单个字符
r+要替换成的字符
R:进入替换模式,用ESC退出
用于替换多个字符
撤销更改;u(最多撤销近50次操作)
3u撤销最近3次操作
ctrl+r撤销刚才的撤销操作
重复前一次的编辑操作:.
可视化模式:
v/V进入
V选中整行
选中后按d:删除
y:复制
p:粘贴
/a:向后查找a
?a:向前查找a
n找下一个,N找上一个
查找并替换
在末行模式下用s命令
%:表示全文
vim 跨文件执行
vim a b
在第一个文件操作后再末行模式下:next
到下一个文件进行操作
:prev回到上一个文件
:last切换到最后一个文件
:first回到第一个文件
分屏显示文件
ctrl+w 松开后再按s(水平分屏),v为(垂直分屏)
ctrl+w+向下的箭头 跳到下一个屏幕
:qa关闭所有窗口
分窗口多个文件
vim -o a b
水平分窗口显示a,b
vim -O 垂直分屏
将当前文件中部分内容另存了为一个文件
:add1,add2 w /新文件路径
将add1到add2的内容新存为文件
将另外一个文件的内容填充在当前文件中
末行模式下
:r /要被添加的文件的路径
跟shell交互
:!command
回车回到vim
显示行号:
set nu
set nonu不显示
忽略大小写
:set ignorecase/set ic
不忽略
:set noignorecase
设定自动缩进
:set autoindent/set ai
取消前面加no
高亮搜索
:set hlsearch
语法着色
:syntax on
vim配置文件
/etc/vimrc
对所以人生效
如果只想对当前用户生效
vim ~/.vimrc
使用vimtutor学习vim:
shell>vimtutor
字符测试
-n
-z测试是否为空
组合测试条件
-a :与关系
例如:
if [ $# -gt 1 -a $# -le 3]
等价于
if [ $# -gt 1 ] && [ $# -le 3 ]
-o:或关系
!:非关系
文件查找:
locate:
在全系统模糊查找文件(非实时)
updatedb:手动生成文件数据库
locate:优势速度快
find
1)实时查找
2)精确查找
3)遍历指定目录中索引文件完成查找
4)支持许多查找标准
find 查找路径 查找标准 查找后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示到屏幕
find匹配标准
-name 'filename' 对文件名进行精确匹配
-iname 'filename'对文件名匹配时不区分大小写
-user USERNAME:根据文件的属主来查找
-group GROUPNAME:根据文件的属组来查找
-uid
-gid
-nouser 专门查找没有属主的文件
-nogroup
-type 根据文件类型来查找
f:普通文件
d
c:字符设备
b:块设备
l:符合连接
p:管道设备
s:套接字文件
-size 根据文件大小来查找
数字+单位
[+|-]数字k
M
G
例如find -size 512M
默认单位为字节
组合条件
-a
-o
-not
例如
find -nouser -a -type d
注意shell括号要加斜线
\(\)
根据时间查找
-mtime(modify指内容)
-ctime(change)
-atime(access)
后面的数字是天数,可以用+|―
-mmin
-cmin
-amin
表示分钟
根据文件权限查找
-perm MODE
精确匹配
MODE可以是755。。。。
-perm -MODE
文件权限能完全包含此MODE就匹配,它的范围大于 -perm MODE
-perm /MODE
表示有任何一位匹配就可以了
运作
-print:显示
-ls :类似于ls -l
-ok command {} \;每一次操作都需要用户确认
-exec command {} \;不需要确认
XARGS命令
find里面的
find -exec
等于
find xargs command
xargs不要\;结尾
但是需要管道
find xx|xargs command
特殊权限
SUID:运行某程序时,相应进程的属主仍保持文件的属主
chmod u+s file :如果file原来就有执行权限则suid 显示为s,否则显示为S
SGID:运行某程序时,相应进程的属组仍保持文件的属组
sticky:表示在一个公共目录,每个人都能创建文件,删除自己的文件,但不能删除别人的文件
chmod o+t DIR 添加sticky
chmod o-t DIR 删除sticky
000
001:只有stciky
..
111
例如
chmod 1755 /backup/test 有sticky
普通用户无法使用:chown
FACL:文件系统的访问列表
利用文件扩展保存额外的访问控制权限
setfacl
-m:设定
-x:取消设定
u:UID perm
g:GID:perm
例如:
setfacl -m u:user1:rw backup
setfacl -x u:user1 backup
getfacl
例如:
getfacl backup
给一个目录设定默认的访问控制列表
例如:
set -m du:user1:rx dir
几个命令
whoami
who显示登陆的用户有哪些
-r 显示当前运行级别
sleep +n :休眠n秒
w:显示登陆用户信息以及该登陆用户正在执行的命令
w显示的信息是who的加强版
last:用于显示登陆/重启的历史(即用户显示/var/log/wtmp文件)
last -n 3:只显示最近三次的信息
lastb 用于显示/var/log/btmp文件,用于显示用户错误的登陆尝试
也支持-n选项
lastlog:显示每一个用户最近一次登陆信息
显示特定用户的
-u username
basename:用户显示路径的基名
basename $0 取脚本本身的基名
mail:打开自己的邮箱系统
mail -s 指定标题
发给root邮件
cat qq |mail -s 'hi' root
hostname:显示当前主机的主机名
hostname xx将hostname 改为xx
生成随机数
RANDOM
0-32768
用法举例
echo $RANDOM
随机数生成器
/dev/random 熵池空了后自己不能生成随机数
/dev/urandom 熵池空了后自己生成随机数
终端类型
console:控制台
pty:物理终端
tty:虚拟控制台(虚拟终端)
ttys:串行终端
pts/数字 :伪终端
case语句:每个分支;;结尾
case SWITCH in
value1)
statement
....
;;
value2)
statement
....
;;
*)#相当于default
statement
....
;;
esac
例如:
case $1 in
[0-9])
echo 'a' ;;
[a-z])
echo'b';;
esac
磁盘管理:
根是自引用的
分区:是磁盘的逻辑边界
目录只是一个路径映射表
两个指向同一个inode的不同路径:叫做硬链接
1)硬链接只能对文件创建
2)不能跨文件系统,但是可以在不同的目录下
3)创建硬链接会增加文件被链接的次数
硬链接次数小于等于一时才能真正删除一个文件
符号链接(软链接)
1)可以应用于目录
2)可以跨文件系统
3)不会增加被链接文件的链接次数
4)其大小为指定的路径所包含的字符个数
创建链接
ln [-s -v] 源文件 目的文件
-s:为软链接
-v:显示过程
不带-s为硬链接
du 目录
查看所有文件的大小
du -s 目录
整个目录大小
du -h 目录
能够进行单位换算
df [option] [file]
显示分区情况
直接打df就能用的
df -i
看inode情况
df -p
不换行显示
设备文件(不占内存,因为没有大小)
块设备:按块为单位,随机访问的设备 如硬盘
字符设备:按字符为单位,线性设备 如键盘
/dev
那两个数字的意思
主设备号
标识设备类型
次设备号
标识同一种类型中不同设备
设备号存在inode当中
创建设备文件命令
mknod [opyion] name type [major|minor]
mknod -m MODE
查看当前系统有多少硬盘以及信息
fdisk -l
管理磁盘分区:
fdisk
p:显示当前硬件的分区,包括没保存的改动
n:创建新分区
e:拓展分区
p:主分区
d:删除一个分区
w:保存退出
q:不保存退出
t:修改分区类型
L:
l:显示所支持的所有类型
高级格式化:mkfs
linux使用虚拟文件系统机制,虚拟文件系统是内核的模块
文件块大小只能是2的次方
内存空间分页面,页框大小一般是4K
bootloader在MBR里,MBR在512个字节大小的扇区里
创建文件系统时创建多少块组,这个数字保存在超级块中
超级块,GDT不能被损坏,所以需要备份多次
超级块中包含分区的全局信息
GDT:块组描述表,包含块组名,块组边界等信息
压缩、解压缩命令:只能压缩文件不能压缩目录
压缩格式:gz,bz2,xz,zip,z
默认压缩后会删除源文件
gzip: .gz
bzip2: .bz2
xz: .xz
gzip +文件名/路径:能够实现压缩,可以添加多个文件
解压缩:
gunzip (等价于 gzip -d ):
gunzip +文件名/路径 实现解压缩
解压完成后会删除原压缩文件
gzip -#:#取1-9,这是指定压缩比,默认压缩比为6
zcat:查看压缩文件
bzip2: .bz2
bzip2:比gzip有着更大的压缩比
也支持 -d
-#
默认压缩时也会删除源文件
但是
bzip2 -k 能够保留源文件
解压缩命令:
bunzip2
查看
bzcat
xz: .xz
压缩比更好,用法和gzip用户一样
解压缩
unxz
查看
xzcat/xzdec
zip:能够归档也能压缩(压缩后不删除源文件)
zip filename.zip file1 file2 ...
压缩时能够保持目录本身的结构
压缩总多文件的功能
archive:归档,归档本身不意味着压缩
例如
zip test.zip /etc/test/*
解压缩
unzip test.zip
只归档不压缩
tar
-c 创建归档文件
-f + 归档后的文件名.tar 操作的归档文件
-x:展开归档,展开后.tar不删除
--xattrs:表示在归档时保留文件的拓展属性信息
-t:不展开归档查看文件
-zcf:归档并调用gzip压缩
-zxf:调用gzip解压缩并展开归档
-jcf:调用bzip2
-jtf:调用bzip2压缩,并查看文件
-jxf:
-Jcf:调用xz
-Jxf:
甚至上面的指令可以不要-z,-j,-J因为tar可以根据文件后缀
选择压缩工具
例如:
tar -tf test.zip
cpio和tar的功能一样只是跟古老
read -p "..."
“”为提示信息
-t #后面为等候时间单位秒
例如:
read -t 5 A B
[-z $A]&& A=100
-z这里表示A超过延时时间没有值,我们手动赋值100
while循环:适用于循环次数未知的场景
while 条件 ; do
statement
....
done
例子:
#!/bin/bash
declare -i I=1
declare -i SUM=0
while [ $I -le 100 ] ; do
let SUM+=$I
let I++
done
echo的特殊用法
echo -e "\033[1mHello\033[0m,world."
echo -e "\033[33mHello\033[0m,world."
两位的3引导颜色,个位调整颜色
4引导背景符
例如:
echo -e "\033[1;37;41mHello\033[0m,world"
RAID:独立冗余磁盘阵列
文件在磁盘上以扇区存储
在文件系统级别上以datablock存储
RAID :0为条带
性能提示:读,写
冗余(容错)能力无
1为镜像
写性能降,读性能提升
有冗余能力
2
3
4:用校验码
5:轮流存校验码
读写性能提升
有冗余能力
jbod:将多块盘连接成一块盘
madam::能将任何块设备做成RAID
until循环
until condition; do
statement
....
done
for 变量 in 列表; do
循环体
done
还有一种类似C语言的写法
for ((( ));do
循环体
done
查看n次是否在线
ping -c 数字n IP号
-W timeout
AWK:报告生成工具
awk 'pattern{action}' file
action:
例如:
awk '{print $1,$3}'
$0表示一行的所有字段
$NF表示最后一个字段
awk - F:指定输入分割符
while,until,for
break:提前退出循环
continue:提前进入下一轮循环
制造死循环;while :;do
done
while read LINE ;do
循环体里可以对LINE进行处理
done < /文件 路径
脚本编写之函数
1)定义函数
function functionname{
command
}
或者
functionname(){
command
}
函数调用:直接在调用处写函数名就可以了
函数自定义执行状态返回值:
return n
n为0-255
接受参数的函数
函数名 参数1 参数2
$1 参数1
$2 参数2
if `command`里面相当于 echo command
进程优先级:越小越高
0-99系统安排
100-139:自己调整
nice值(-20到19),nice值越小,优先级越高
查看当前进程;
ps:process state
a:查看和终端相关的进程
x:查看和终端无关的进程
u:看谁开启终端
-e:显示所有进程
ps -o 参数1, 参数2
例如: ps -o ni,pri
pstree:显示进程树
pgrep:以grep的风格显示匹配的进程,只显示进程号
pgrp -u bash
pidof 找进程的id号
top
M:根据驻留内存大小进行排序
P:根据cpu使用百分比进行排序
T:根据累计时间进行排序
l:是否显示平均负载和启动时间
t:是否显示进行和cpu状态相关信息
m:是否显示内存相关信息
c:是否显示完整的命令行信息
q:退出top
k:终止某个进程
-d:指定刷新时间
-b:批处理模式
-n +n:批处理模式下,只显示几屏
vmstat:系统状态查看命令
free
kill:终止进程
kill pid
kill %作业号
killal command
pkill和pgrep类似
bg:让后台的停止作业继续运行
bg [作业号]
jobs:查看后台所有作业
作业号不同于进程号
+:命令将默认操作的作业
-:+结束后操作的作业
fg:将后台作业调回前台
进程状态:
D:不可中断的睡眠
S:可中断的睡眠
R:运行或就绪
T:停止
Z:僵尸
<:高优先级进程
N:低优先级进程
+:前台进程组中的进程
l:多线程进程
s:会话进程首进程
进程间通信(IPC)
共享内存
信号
semaphore(旗语)
重要的信号;
1 SIGHUP:让一个进程不用重启就可读其配置文件,并让新的配置信息生效
2 SIGINT 中断一个进程
9 SIGKILL 杀死一个进程
15 SIGTERM 终止一个进程,默认信号
指定一个信号:
信号号码:kill -l
信号名称;kill -SIGKILL
信号名称缩写:kill -KILL
调整nice值
调整已经启动的进程的:
renice NI PID
在启动时指定nice值
nice -n NI COMMAND
前台命令送到后台
ctrl+z:把正在前台的作业送往后台
command &:让命令在后台执行
sudo:某个用户能够以另外哪一个用户的身份通过哪些主机来执行什么命令
sudo 命令的绝对路径
sudo后会要输入密码(当前使用者的密码),并在第一次输入密码后保存5分钟
sudo -k 关闭保存密码5分钟这一特性
sudo -l 列出当前用户可以使用的所有sudo类的命令
sudoers文件里添加信息:
who which_host=(run as who) [tag]command
对称加密:用相同密钥,传输速度快
单向加密算法:提取特征码,保证数据的完整性
协商生成算法:密钥交换算法(密钥随时替换)
非对称加密算法:(公钥加密算法)
密钥队:
公钥:p(公开的)
私钥:s
发送方用自己的私钥加密数据,可以实现身份验证
发送方用对方的公钥加密数据可以保证数据的机密性
awk:报告生成器
awk [options] 'script' file1 file2
awk [options] 'pattern {action}' file1 file2
例如: awk '{print $1}' test.txt
awk 'BEGIN{OFS=":"}{print $1,$2,$3,$4}' test.txt
插入:awk 'BEGIN{OFS=":"}{print $1,"hello",$2}' test.txt
awk变量
FS:field separator 默认是空白字符,读取文本时所使用的字段分割符
RS:record separator 默认是换行符,输入文本信息所使用的换行符
OFS:output field separator
ORS:output row separator
awk -F:输入分割符号:
等价于awk '{FS=":"}'
NR:the number of input records,awk命令所处理的记录数,如果有多个文件,这个数目会吧处理的多个文件中统一计数(一起计数)
NF:number of field:当前记录的field个数
FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数(各自计数)
ARGV:数组,保存命令行本身这个字符串,如awk'{print $0}' a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt
ARGC:awk命令的参数的个数
FILENAME:awk命令所处理的文件的名称
ENVIRON:当前shell环境变量及其值的关联数组
变量赋值
awk -v 变量名=“ ”
或者
awk ''BEGIN{var="variable testing";print var}'
printf用法
例子:
awk -F: '{printf "%-15s %i\n",$1,$3}'/etc/passwd
awk支持的pattern
1.正则表达式,格式为/regular expression/
2.表达式,其值为非0或者为非空字符时满足条件,如:$1==" ",$1~“模式”
3.指定的匹配范围,格式为pat1,pat2,pat1和pat2为模式
4.BEGIN/END:特殊模式,仅在awk命令执行前运行一次或者结束前运行一次
5.Empty(空模式):匹配任意输入行
例子:
打印表头:
awk -F: 'BEGIN{print "Username ID Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd
常见的action:
1.expression
2.control statements
3.compound statements
4.input statements
5.output statements
控制语句:
1.if-else
语法:if (condition) {then-body}else {[else-body]}
例子:
awk -F: '{if ($1=="root") print $1, "admin"; else print $1,"common user"}' /etc/passwd
awk -F: '{if ($1=="root") printf"%-15s: %s\n",$1,"admin";else printf "%-15s: %s\n",$1,"common user"}'/etc/passwd
awk -F: -v sum=0 '{if ($3>=500)sum++}END{print sum}' /etc/passwd
2.while
语法:while (condition){statement1;statement2;...}
awk -F: '{i=1;while(i<=3){print $i,i++}}' /etc/passwd
3.do-while
语法:do{statement1,statement2,...}while(condition)
awk -F: '{i=1;do{print $i;i+++}while(i<=3)}' /etc/passwd
4.for
语法:for (variable assignment;condition;iteration process) {statement1,statement2,...}
awk -F: '{for(i=1;i<=3;i++)print $i}' /etc/passwd
for循环还可以用来遍历数组元素;
语法:for(i in array){statement1,statement2,...}
awk -F: 'NF!~/^$/{bash{NF}++}END{for (A in bash){printf "%15s:%i\n",A,bash[A]}}' /etc/passwd
5.case
语法:switch (expression) {case VALUE or /正则表达式/ :statement1,statement2,...default:statement1,...}
6.break 和continue
常用于循环或者case语句中
7.next
提前结束对本行文本的处理,并接着处理下一行:例如,下面的命令将显示其ID为奇数的用户
awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
数组
for (var in array){statement1,...}
例子:
netstat -ant |awk '/^tcp/{++s[$NF]}END{for(a in S)print a,S[a]}'
每出现一被/^tcp/模式匹配到的行,数组是S[$NF]就加一,NF为当前匹配到的行的最后一个字段,此处用其值作为数组S的元素索引
awk '{counts[$1]++};END{for(url in counts)print counts[url],url}' /var/log/httpd/access_log
用户与上一个例子相同,用于统计某日志文件中IP地址的访问量
先放上来呗,我再慢慢改。。。。。。