查看方式有两种:一种可以直接输入umask,就可以看到数字类型的权限设置值,
一种则是加入umask后加入-S(Symbolic)选项,就会以符号类型的方式来显示出权限了
umask的数字指的是该默认值需要减掉的权限,r、w、x分别是4、2、1
用户建立为文件默认没有可执行权限 (x),所以文件权限最大为666
用户建立为目录,x与是否进入目录有关,所以目录权限最大为777
建立文件时,文件权限就是666-022=644 即rw-r--r--
建立目录时,目录权限就是777-022=755 即rwxr-x-rx
在默认情况中,root的umask会拿掉比较多的属性,root的umask默认是022,这是基于安全的考虑,
至于一般身份用户,通常它们的umask为002,即保留同用户组的写入权限
在普通用户下:
如果我们要进入一个目录,我们需要的权限是:x(可执行权限)
对于目录来讲,如果没有r(可读)权限,我们无法查看当前目录下的文件名+文件属性
如果没有w(可写)权限,我们无法直接在该目录下创建新文件。
bash 特性:
1, !! 执行上一条命令
2, !$ 获取上一条命令输入的参数
3, $? 获取上一条命令执行结果的返回值,0表示成功呢
ls /var && echo "success" 前一个执行成功,后一条才会执行
ls /var || echo "success" 前一个执行成功,后一条不会执行
id user &> /dev/null && echo "exists user" || echo "not exists"
#重定向输出不管命令执行结果,仅仅只是把结果值输出到某个设备中去
[jerry@node1 /]$ id user &> /dev/null
[jerry@node1 /]$ echo $?
1
[jerry@node1 /]$
基本正则表达式元字符:
字符匹配:
. : 匹配任意一个单字符
[] : 匹配范围内任意一个单字符
[^]: 匹配除范围外任意一个单字符
[:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次数:用于指定字符前面出现的次数
* 前面字符出现任意次数 0 - 无穷次
x*y
xxxxxy
xy ---> x出现了1次
xay -----> 只匹配到了y ,x 出现了0次
.* 表示任意字符出现任意次
\? 表示前面这个字符出现0次或1次 ,可有可无
\+ 表示前面这个字符至少出现一次
\{m\} 表示前面这个字符出现m 次
\{m,n\} 表示前面这个字符至少出现m 次 至多出现n 次
\{0,n\} 表示前面这个字符至多出现n次,也可能时 0 次
\{m,\} 至少出现m 次
位置锚点:
^ : 表示行首锚定,位于模式的最左侧
$ : 表示行尾锚定。位于模式的最右侧
^PATTERN$ 用于整行定位:
^$ 空行
^[[:space:]]*$ 包含空格
\< 或 \b: 单词锚定,位于单词最左侧
\> 或 \b: 单次锚定。位于单次最右侧
\<pattern\> 匹配整个单词
分组:
\(\) : \(xy\)\{1,3\} 让 xy 这个组合串一起出现 至少出现1次最多三次
后向引用:
引用前面分组模式所匹配的字符串,而非模式本身
NOTE : 分组括号中的模式匹配到的内容会被规则引擎所记录到变量中去,用 \1 \2 \3 \4 ……
\1 从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符串
\(ab\+\(xy\)*\)
\1: ab\+\(xy\)*\
\2: xy
举例:
[jerry@node1 /]$ grep '\([[:alpha:]]\{1,3\}t\).*\1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
[jerry@node1 /]$ grep '\([[:alpha:]]\{1,3\}t\)\1' /etc/passwd
[jerry@node1 /]$ grep '\([[:alpha:]]\{1,3\}t\)\1' /etc/passwd
[jerry@node1 /]$ ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv swapfile sys tmp usr vagrant var
[jerry@node1 /]$ cd ~
[jerry@node1 ~]$ ls
a.txt
[jerry@node1 ~]$ vim a.txt
[jerry@node1 ~]$ grep '\([[:alpha:]]\{1,3\}t\)\1' a.txt
vtvt
BASH 快捷键:
CTRL+ l 清除屏幕
ctrl + a 跳转到命令头部
ctrl+ e 跳转命令尾部
ctrl + u 删除命令光标前的字符串
ctrl + k 删除光标后面的字符串
练习:
1,查找/proc/meminfo ,以行首s字符开头,忽略大小写;至少两种写法
grep -i '^s' /proc/meminfo
grep '^[Ss]' /proc/meminfo
2, 查找 /etc/passwd 不以 /bin/bash 结尾的行
grep -v '/bin/bash$' /etc/passwd
3, 查找以 /etc/passwd id 最大的用户,输出用户名
sort -t: -k3 -n /etc/passwd | tail -1f | cut -d: -f1
4,如果root存在,显示其默认的shell程序
id root &> /dev/null && grep '^root\>' /etc/passwd | cut -d: -f7
5,找出 /etc/passwd 两位或三位数
grep -o '\<[0-9]\{2,3\}\>' /etc/passwd
6, 找出 /etc/grub.cfg 以空白字符开头,后面伴随非空白字符的行
grep '^[[:space:]]\+[^[:space:]]' /etc/grub.cfg
7, 通过 netstat -tan 查找 LISTEN 后出现一个或多个空白字符的行
netstat -tan | grep 'LISTEN[[:space:]]*$'
8, 添加用户bash ,basher,testbash ,nologin(其shell为 /sbin/nologin) ,找到/etc/passwd 中与用户名相同的shell名
useradd bash
useradd basher
useradd testbash
useradd -s /sbin/nologin nologin
查找用户名
grep '^[[:alnum:]]\+\>' /etc/passwd
以第一个用户名作为后向引用结尾的参数
grep '\(^[[:alnum:]]\+\>\).*\1$' /etc/passwd
9,查看root是否登录,若登录显示在线,否则显示未登录
[root@node1 ~]# w
07:34:46 up 1 day, 2:04, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
vagrant pts/0 10.0.2.2 05:04 6.00s 0.08s 0.12s sshd: vagrant [priv]
[root@node1 ~]# w | grep '^root\>'
[root@node1 ~]# echo $?
1
[root@node1 ~]# w | grep '^vagrant\>'
vagrant pts/0 10.0.2.2 05:04 7.00s 0.09s 0.12s sshd: vagrant [priv]
[root@node1 ~]# echo $?
0
w | grep '^root\>' &> /dev/null && echo "logged" || echo "not login"
egrep 正则扩展的表达式:
字符匹配:
. : 匹配任意一个单字符
[] : 匹配范围内任意一个单字符
[^]: 匹配除范围外任意一个单字符
[:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次数:用于指定字符前面出现的次数
* 前面字符出现任意次数 0 - 无穷次
x*y
xxxxxy
xy ---> x出现了1次
xay -----> 只匹配到了y ,x 出现了0次
.* 表示任意字符出现任意次
? 表示前面这个字符出现0次或1次 ,可有可无
+ 表示前面这个字符至少出现一次
{m} 表示前面这个字符出现m 次
{m,n} 表示前面这个字符至少出现m 次 至多出现n 次
{0,n} 表示前面这个字符至多出现n次,也可能时 0 次
{m,} 至少出现m 次
位置锚点:
^ : 表示行首锚定,位于模式的最左侧
$ : 表示行尾锚定。位于模式的最右侧
^PATTERN$ 用于整行定位:
^$ 空行
^[[:space:]]*$ 包含空格
\< 或 \b: 单词锚定,位于单词最左侧
\> 或 \b: 单次锚定。位于单次最右侧
\<pattern\> 匹配整个单词
分组:
() : (xy){1,3} 让 xy 这个组合串一起出现 至少出现1次最多三次
后向引用: 引用前面分组模式所匹配的字符串,而非模式本身 ,后向引用的参数: \1 \2 \3
或关系: (ab|[:digit:]) 表式出现ab 或 数字
练习:
1,显示当前用户root ,centos ,user1 的用户id和shell
grep -E '^(root|jerry|tom)\>' /etc/passwd | cut -d: -f1,3,7
2,找出/etc/rc.d/init.d/functions 文件中某个单词后面跟一个小括号的行
grep -E '^[_[:alpha:]]*\(\)$' /etc/rc.d/init.d/functions
grep -E '^[_[:alpha:]]+\(\)$' /etc/rc.d/init.d/functions
3,使用echo 输出一段绝对路径,使用egrep取出其基名basename
#空词
echo "/etc/networks" | grep -E '\<\>'
#匹配词,除/的一个单字符
[root@node1 ~]# echo "/etc/networks" | grep -E '[^/]\>'
/etc/networks
[root@node1 ~]#
echo "/etc/networks" | grep -E '[^/]+\>'
本地变量:对当前shell有效,其余均无效
环境变量:当前shell环境中定义的变量,对本shell及其子shell有效,其余均无效
位置变量:输入命令传递的变量
局部变量:代码块变量
特殊变量: $? $0 $* $@ $#
本地变量:
变量赋值: name='value' ### 注意这里的变量要紧挨着
可以使用引用:
value:
(1)可以是直接字符串; name="username"
(2) 变量引用: name="$username"
(3) 命令引用: name=`COMMAND` , name = $(COMMAND)
变量引用: ${name}, $name 后面这种情况,如果变量未被其它影响可以不用{}
"" : 弱引用,其中的变量引用会被替代为变量值
"" : 强引用,其中的变量引用不会替换为变量值,而保持原字符串
pstree 可以产看当前的有哪些进程在跑
显示已定义的变量
set
销毁变量:
unset name
环境变量:
查看: export, env, printenv
设定环境变量: declare -x num=3 , export name=value
只读变量:
readonly name
declare -r name
位置变量:
$0 : 命令本身
$1 $2 $3 ...... 对应命令第一,第二参数
$* 传递脚本所有参数,但为总一个字符串
$@ 传递脚本所有参数,分为多个
$# 总参数个数
shift [n] t剔除n个参数
配置文件:
交互式登录:
/etc/profile -> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
bash中的算术表达式:赋值符号一定紧挨着
(1)let var=算术表达式
(2)var=$[算术表达式]
(3)var=$((算术表达式))
(4)var=$(expr arg1 arg2 arg3 ......) //这种方式 * 要加转移符
value=$( expr 1 \* 4 )
条件判断测试:里面判断值前后一定要有空格
test expression
[ expression ]
[[ expression ]]
数值测试:
-gt
-ge
-eq
-ne
-lt
-le
字符串测试:
==
>
<
!=
=~ : 左侧字符串是否能够被右侧pattern所匹配
注意: [[ "$name" =~ ^O.* ]] 模式这边不能加单引号,需要 [[ ]]
-z "string" 是否为空串
-n "string" 不为空串
[ -n "$name" ]
vim 编辑器命令:
+n : 打开后指定到多少行
+ pattern : 匹配到某个字符第一个所在的位置
vim + /etc/passwd 光标停留在在最后一行
模式转换:
编辑模式 --》输入模式
i: 在光标前插入
a: 在光标后插入
o: 在光标所在行下新建一个行
I: 当前光标所在行的行首插入
A: 当前光标所在行的行尾插入
O:当前行所在行的上方打开一个新行
c:
C:
输入模式 --> 编辑模式
ESC
输入模式 --> 末行模式
:
关闭文件:
q
wq
x 保存退出
w /path
ZZ 编辑模式下输入,保存退出
字符间跳转:
h j k l
h: 左
l: 右
j: 下
k: 上
一次跳过指定个数的字符: 10k 10l 10j 10h
单词间进行跳转:
w b e
w:下个单词词首
e: 当前或下一个单词的词尾
b: 当前或前一个单词的词首
一次跳转指定多少个单词数: 10b 10w 10e
行首行尾跳转:
^: 跳转至行尾的第一个非空白字符
0:跳转到行首
$: 跳转到行尾
行间移动:
#G: 跳转至指定的行
G:最后一行
1G 、gg : 表示回到第一行
句间移动:
)
(
段落间移动:
} 下一个段落
{ 上一个段落
vim的编辑命令: 命令模式
字符编辑:
x: 删除光标处的字符
#x: 删除指定个数字符
xp: 交换光标所处字符及其后面字符的位置
替换命令: r replace
r : 修改单个字符的命令
ra : 把当前光标所指定的字符修改为a
3rm : 把光标后指定的多个字符一键替换为m
删除命令:
d: 删除命令,可结合光标,实现范围删除
d$:
d0:
d^:
dw:
db:
de:
d):
d}:
dd: 删除光标所在行, #dd 删除多行
粘贴命令:p put paste
p: 缓冲区存的是整行,粘贴为当前光标所在行的下方行,否在在当前光标的后面
P:缓冲区存的是整行,粘贴为当前光标所在行的上方行,否在在当前光标的后面
复制命令(y , yank)
y: 复制命令,工作行为相似于d命令
y$: 复制到行尾
y0: 复制到行首
y^: 复制到行尾的第一个空白字符
yw: 复制光标至下个单词词首前
ye:
yb:
#y 指定复制多行
yy 复制一行
#yy 复制多行
改变命令: c change
会改变模式 编辑---》输入
c$
c^
c0
cb
ce
cw
cc: 删除并输入新内容 ,删除单行修改
#cc : 指定删除多行,并修改
可视化命令:
v: 按字符选定
V:按行选定
常结合编辑命令使用:
d c y
撤回命令:u undo
#u: 撤回指定n次
撤销此前的撤销:restore
Ctrl + r
重复前一个编辑命令操作:点号
.
翻盘操作:
Ctrl + f: 向文件尾部翻一屏
Ctrl + b:向文件首部翻一屏
Ctrl + d:向文件尾部翻半屏
Ctrl + u: 向文件首部翻半屏
vim 自带的教程: vimtutor
vim 的末行模式: 内建命令行的接口
地址定界:start_p, end_p
:2,200 从2到100行
:2,+4 从二开始,往后移动多加4行例如: 1,+3d 从第一行开始,后面三行删除
: . 表示当前行
:$ 最后一行
. , $-1 当前到倒数第一行
:% 全文,相当于 1,$
/PATTERN1/ , /PATTERN2/
从左侧第一次匹配的模式,到第二个模式第一次匹配
#, /pat/ 从几到匹配的模式第一个字符串
/pat/, $ 模式匹配到最后行尾
使用方式:
通过地址定界直接跟命令
:1,20w /path/another.txt 指定范围内的内容存在新的文件
:r /path/file 把指定文件插入到当前所指定的光标下
查找功能:
/PATTERN : 从当前光标所在处向文件尾部查找
?PATTERN : 从当前光标所在处向文件首部查找
n: 与命令同方向
N: 与命令反方向
查找并替换:
s:在末行模式下完成查找并替换
s/要查找的内容/替换的内容/修饰符
要查找的内容:可以使用模式,基本正则表达式
替换的内容: 不能使用模式,可以使用\1,\2 ..... .可以用“&”引用前面查找内容
修饰符: i 忽略大小写, g 全局替换,否则一行只会替换第一次出现的
:. , $s/r\(..\)t/R\1T/g 查找以r开头 t 结尾的字符并替换 为 R, T,中间的字符不变
:%s/l..x/&er/g 找到的字符补上er
: 1,10s/how/HOW 替换找到的第一个字符
不用转义的符号:使用其它的符号来替换分割符号
:%s@@/etc/fstab@@/var/log@@g
: %s/^[[:space:]]\+//g 以空格开始的行替换为空
%s/^[[:space:]]/#&/ 每一行以空格开始的行,把它替换成#
花括号{1,2,3}命令展开模式
vim etc/{1.txt,2.txt,3.txt}
在多个文件来回切换:
复制,粘贴,删除功能
:next 下一个文件
:prev 上一个文件
:first 第一个文件
:last 最后一个文件
:wall 保存所有
:qall 退出所有
窗口分割模式:
vim -o|-O file1 file2 file3
-o 水平分割
-O 垂直分割
窗口间切换: Ctrl + w ,左右键切换 or 上下键
当文件窗口切割: Ctrl + w , s 水平分割 Ctrl+w,v 垂直分割
定制vim 工作特性:
配置文件:
全局: /etc/vimrc
个人: ~/.vimrc
末行: 当前vim 进程有效
(1)行号
:set nu 显示
: set nonu 取消
(2) 括号匹配
:set sm 显示匹配
:set nosm 取消括号显示匹配
(3)自动缩进
:set ai
: set noai
(4) 高亮搜索
:set hlsearch
: set nohlsearch
(5): 语法高亮:
: syntax on
: syntax off
(6): 忽略字符大小写
: set ic
: set noic
文件测试命令:
存在性测试:
-a file
-e file 存在为真,否则为假
文件类型测试:
-b file 块文件
-c file 字符设备文件
-d file 目录文件
-f file 普通文件
-h | -L 链接文件
-p file 管道文件
-S file 套接字文件
-r 可读
-w 可写
-x 可执行
-s 文件大小
-t 描述文件句柄fd是否打开,且与某个终端相连接
文件特殊权限测试:
-g file sgid 权限
-u file suid 权限
-k sticky 权限
-N file : 文件自从上被读取后是否被修改
-O file : 当前用户是否为主
-G file: 当前用户是否为组
******双目测试********:
file1 -ef file2 file1与file2 是否指向同一个设备上相同的inode
file1 -nt file2 file1 是否新于file2
file1 -ot file2 ..................旧于
组合测试条件
逻辑运算
第一种方式:
command1 && command2
command1 || command2
! command
[-e file ] && [ -r file ]
第二种方式:
expression1 -a expression2
expression1 -o expression2
! expression1
[ -z "$hostName" -o "$hostName"=="localhostdomain" ] && hostname www.baidu.com
##查看文件类型,加引号是字符串
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
判断文件既不可读也不可写
[ ! \( -r /tmp/ff.txt -o -w /tmp/ff.txt \) ] 非的条件表达式,需要用()框起来,否则条件不成立 [ ! -r /tmp/ff.txt -a ! -w /tmp/ff.txt ]
查找命令:
locate keyword 通过关键字离线查找
find /file/path
find [optinon] [查找路径] [查找条件] [处理动作]
默认不给路径,默认当前目录机型查找。一般就是所有的文件都会显示
查找条件:
-name "文件名称" 支持golob *,? , [],[^]
-iname "文件名" ,不区分大小写
-regex "pattern" : 以pattern 去匹配整个文件路径的字符串,不仅仅是文件名称
根据属主,属组查找:
-user 用户名 : 属主
-group 组名: 属组
-uid uid : 通过uid 查找
-gid gid : 通过gid 查找
-nouser /nogroup 无主或组的文件
find /home -user vagrant -ls
find /tmp -group vagrant -ls
根据文件类型查找:
-type TYPE:
f d l s b c p
find /tmp -type s -ls
组合条件:
与: -a
或: -o
非: -not , !
find / \( -nouser -o -nogroup \) -ls 查找无主或者无组的文件,ls 对这两个条件做列表,否则只显示靠近的哪一个条件显示
查找不是fstab 并且属主不为root 的文件
find / \( -not -name "fstab" -a -not -user root \) -ls
find / -not \( -name "fstab" -o -user root \) -ls
根据文件大小查找:
-size [+|-]unit
k ,g ,
find /var -size 3k -exec ls -lh {} \;
不是用+- 符号,则为(3-1,3】这样一个范围的文件
-#unit 范围: 【0, #-1】
+#unit 范围: 【#, +无穷】
根据时间戳来查找:
天
-atime [+|-]#
#: [#,#+1)
+#: [#+1,无穷大]
-#: [0, #)
touch -a -t 202303050707.00 aa.txt 修改文件访问时间
-mtime
-ctime
分钟
-amin
-mmin
-cmin
根据权限查找:
-perm [+|-]MODE
MODE: 600 权限精确匹配
+MODE: 任何一类(u,g, o)对象中,只要有一位匹配即可,0 不做考虑
find / -perm +001 -ls 查找其它用户有执行权限的文件
-MODE:每一类对象都必须同时拥有为其指定的权限
-666 ,文件的三类(u,g, o) 都要大于等于当前文件权限的数字
centos7 中+MODE 废除,用/MODE 表示
处理动作:
-print 默认显示到控制台
-ls 列表展示
-ok COMMAND {}\; 每个文件都会执行该命令,每个都需要确认
{} 用于引用查找到的文件名自身
-ok mv {} {}.new \; 修改文件名,原来的名以.new 为后缀
-exec COMMAND {}\; 对查找的到每一个文件都会执行该命令
参数过长,采用 find | xargs COMMAND 命令进行