1.vi/vim文本编辑器
vim是vi的增强版,vi是系统自带的。以下命令在vi/vim中通用:
刚打开的默认模式
快捷键:gg 跳到文件开头,G 跳到文件最后一行。
快捷键:0 跳到行首,$ 跳到行尾。
快捷键:CTRL+鼠标左键,可以将光标定位到任意位置
快捷键:dd 删除光标所在行
删除多行:首先进入底线模式,输入显示行号命令:set nu,然后输入你要删除的行,再输入d,即可删除。如:5,10d 代表删除5-10行。取消行号命令:set nonu
撤销恢复操作:按u
底线模式,在默认模式下,按:进入。按esc回到默认模式。
命令:w 保存,另存为一个新文件:w 文件名
命令:q退出,如果你修改了文件直接退出会有提示,因为你没保存,这个时候想保存退出使用wq,如果不想保存,直接退出,需要加!来强制退出,如q!
命令:wq保存并退出
命令:set nu设置行号,有了行号之后可以输入行号直接回车,定位所在行。set nonu可以取消行号。
搜索关键字命令:/关键字 即可完成对关键字的搜索,光标会定位到搜索结果的第一个位置,这个时候可以使用n和N在多个结果之间切换,n下一个,N上一个。:
命令:set ic 忽略大小写,set noic不忽略大小写
插入模式,insert模式。
按i、a、o都可以进入插入模式,i是在光标前插入,a是在光标之后插入,o是在光标位置的下一行另起一行插入内容。按esc回到默认模式。
2.Linux权限管理命令
只有文件的所有者或者root用户才能修改文件的权限。
角色:u、g、o三种角色,u拥有者,g所属的组,o其他人。这三个分别是user、group、other的简写。还有一种简写:a,代表all,所有人,指代所有角色。
组管理的相关命令
组可以方便我们对系统资源文件进行权限管理
每个用户至少都有一个组,用户创建的时候,如果不指定,默认会创建跟用户名同名的组。这个组叫做主组。除了主组之外,还可以将用户添加到其他组,这些叫做附加组,可以是多个组,从而共享其他组的资源。
1.1 添加组
groupadd 组名
groupadd dev:创建一个组dev
groupadd test:创建一个组test
1.2 删除组
groupdel 组名
groupdel dev:删除组dev
1.3 将用户添加到指定的组、从指定的组中移除
gpasswd –a/-d 用户名 组名
gpasswd –a zhangsan test
gpasswd –d zhangsan test
1.4 增加用户时,直接增加组
useradd -g 用户组 用户名(指定用户的主组)
useradd -G 用户组 用户名(指定用户的附加组,可以是多个,逗号隔开)
1.5 修改用户的组
usermod -g 用户组 用户名(修改到/etc/passwd用户信息中)
usermod -G 用户组 用户名(修改到/etc/group组信息中)
1.6查看当前登录用户的组内成员
groups
1.7查看某个用户所在的组
groups 用户名
1.8查看所有的用户信息
cat /etc/passwd
以上信息每一行代表一个用户,冒号间隔,如第一行,tommy是用户名,x是密码这里隐藏了,1000是用户id,后一个1000是用户组id,/home/tommy是这个用户的家目录,/bin/bash是shell命令所在目录。
1.9查找某个用户的信息
cat /etc/passwd | grep 用户名
1.10查看所有组的信息
cat /etc/group
每行代表一个组的信息,看最后一行,冒号分隔多个信息,dev代表组名,x是组密码,隐藏了,1009是组id,zp,zhangpei,tommy代表这个组内的用户
1.11查找某个组的信息
cat /etc/group|grep 组名
3.权限类型:r读,w写,x执行
通过查看文件目录的详情信息,来了解权限相关的部分。使用命令:ls -l 这个也可以简写成:ll
第一列:一共10个字符位置,第一个字符代表类型,类型有以下几种:-代表普通文件,d代表目录,l代表链接。第二个到第十个字符,是三个一组出现的,每一组代表了一种角色的读写执行权限,第一组代表了u拥有者的权限,第二组代表了g所属组的权限,第三组代表了o其他人的权限。
第二列:显示一个数字,如果是目录,这个数字代表这个目录下一级子目录的个数(包括了隐藏的当前目录.和上级目录..),如果是文件,这个数字代表这个文件的链接数。
第三列:此文件或目录的所属用户
第四列:此文件或目录所属的组
第五列:显示文件或目录的大小,默认以字节单位显示
第6-8列:显示的是最后修改时间
第9列:文件或目录名称
修改权限:chmod
使用角色代号ugoa来修改权限
chmod o+w 文件或目录名,代表给 其他人o 这种角色增加w写权限
chmod ug+x 文件或目录名,代表给 拥有者 和 所属组 增加执行权限
chmod a-x 文件或目录名,代表给 所有角色 去掉执行权限
chmod g=rw 文件或目录名,代表给拥有者直接赋予rw权限,直接赋予的权限会覆盖原来的权限。
粘着位 t
这个权限位主要对目录有效,但偶尔也会以不同的形式出现在文件上(尽管这通常不常见,且意义不同)。
粘着位(Sticky Bit)在目录上的作用
当粘着位被设置在目录上时(通过chmod +t
命令),它限制了在该目录下创建的文件或子目录的删除和重命名操作。具体来说,只有文件的属主(owner)或超级用户(root)才能删除或重命名该文件或目录。这对于共享目录(如/tmp
和/var/tmp
)特别有用,因为这些目录通常允许所有用户写入文件,但如果不设置粘着位,任何用户都可能删除或重命名其他用户的文件,从而导致数据丢失或混乱。
粘着位(Sticky Bit)在文件上的表现
虽然粘着位主要设计用于目录,但在某些情况下,它也可能以T
的形式出现在文件上。然而,这种情况下的意义与目录上的粘着位不同,且通常不被广泛讨论或应用。在文件上设置粘着位(通过chmod +T
命令,注意是大写的T
,因为文件通常没有执行权限)可能会影响到文件的某些特殊行为,但这并不是粘着位的主要用途。
注意事项
粘着位t
(小写)通常用于目录,而T
(大写)可能出现在没有执行权限的文件上,但这并不是标准用法。
粘着位主要用于控制目录中文件的删除和重命名权限,以防止非属主用户意外或恶意删除其他用户的文件。
可以通过ls -ld
命令查看目录的权限,包括粘着位。如果目录权限的最后一位是小写的t
,则表示设置了粘着位。
使用chmod +t
命令可以为目录设置粘着位,而chmod -t
命令则用于移除粘着位。
总结:
Linux中的T
(或t
)权限位代表了粘着位,它在目录上起着重要的安全作用,用于限制文件的删除和重命名操作。
使用数字模式来修改权限
使用3位数字分别代表三种角色的三种权限,每个数字都可以表示三种权限,每个数字是由三位二进制数字转换而来。
参照下表:
举例:chmod 754 文件名,代表给这个文件754权限,7代表拥有者具有读写执行权限,实际代表111二进制,5代表所属组具有读和执行权限,实际是101,4代表给其他人只读权限,实际是100。
4.文档处理三剑客
grep命令
用于在文件中查找字符串,它是通过正则表达式的语法查找的。
格式:grep 关键词 文件名 代表在文件中查找对应的关键字,关键字部分可以替换成正则表达式。
参数-i:忽略大小写
参数-n:显示匹配的行,同时加上行号
参数-v:显示不匹配的行
使用正则表达式匹配
正则表达式是一种匹配字符串的技术,有它自己的语法和规定,我们不需要学习,只需要使用即可,可以在网络上查找常用的正则表达式,直接使用。
grep "^a" 文件名,代表在文件中查找以a开头的字符
grep "n$" 文件名,代表在文件中查找以n结尾的字符
另外,在配合管道符使用的时候,应经常见到grep命令,比如 cat 文件名 | grep 关键字
sed命令
sed可以按照脚本指令来处理编辑文本文件。主要用来对文件进行增删改操作。它以行为单位来执行操作。注意:动作指令需要使用引号包括,并且只能使用单引号。
语法格式:sed [参数][动作指令] 文件名
参数:
-n:取消默认的输出,这个参数一般配合p(print)一起使用,可以打印指定的内容
-i:会修改源文件。如果不加,sed做的所有操作都不会修改源文件。
-e:可以同时指定多个指令,每个-e后面可以跟一个指令
动作指令:
a:新增
d:删除
c:替换行
i:插入
p:打印,一般和-n参数一起使用
s:替换指定的字符串
实例:
不加参数:
新增a:
sed '2a test' test.txt 在第二行后面新增一行内容test
sed '1,3a test' test.txt 在第1行到第3行每一行后面都增加一行内容test
sed '$a test' test.txt 在最后一行增加一行内容test,$代表最后一行
删除d:
sed '2d' test.txt 删除第2行
sed '1,3d' test.txt 删除第1-3行
替换行c:
sed '2c test' test.txt 将第二行内容整体替换成test
sed '1,3c test' test.txt 将1-3行整体替换成test
插入i:
sed '2i test' test.txt 在第二行前面插入一行内容test
sed '1,3i test' test.txt 在第1-3行每行前面插入一行test
加参数-i会修改源文件
sed -i '2a test' test.txt 在第二行后面新增一行内容test
打印p
不加参数:
sed '2p' test.txt 在默认输出的情况下,打印第二行,相当于第二行打印了两遍
sed '1,3p' test.txt 在默认输出的情况下,打印第1-3行,相当于第1-3行各打印了两遍
加参数-n:
sed -n '2p' test.txt 通过-n参数取消默认输出,只打印第二行
sed -n '1,3p' test.txt 通过-n参数取消默认输出,只打印第1-3行
我们还可以使用正则表达式去匹配我们要找的内容,然后打印出来
sed -n '/^[0-9]*$/p' test.txt 使用正则表达式匹配由全数字构成的字符,并打印出来,正则表达式放在两个/中间。
sed -n '/^[0-9]*$/!p' test.txt 在上面命令p指令前加!,代表取反操作,就是打印不匹配的行。
替换指定的字符串s
sed 's/old/new/' test.txt 替换old为new,默认只替换每一行第一个匹配结果。
如果希望全部替换,需要加g命令,g代表global(全局)如:sed 's/old/new/g' test.txt。
sed 's/OLD/new/gi' test.txt 又增加了一个命令i,代表忽略大小写。
sed '1,3s/old/new/g' test.txt 指定范围内进行替换,只替换第1-3行的内容。
使用-e参数同时指定多个指令:
sed -e 's/old/new/g' -e '2d' test.txt 先用s指令完成替换,然后再用d指令删除第二行
awk命令
awk是一个强大的文本分析工具,简单来说就是把文件逐行读入,默认以空格作为分隔符,然后进行分隔切片,切片后的部分是一列,然后再进行处理输出。它以列为单位来执行操作。
语法:awk [option]'pattern{action}' filename 解释:option是参数,pattern是条件模式,{action}是动作指令。注意:条件、动作指令都需要用引号包括,并且只能用单引号,动作要同时包括在{}里面。
默认情况下,awk是逐行处理文本的,也就是先处理当前行,再处理下一行,这种模式是默认模式,也叫空模式,即条件为空的模式。如果指定了条件模式pattern,awk在处理文本时,只有满足条件的行才会被处理。
准备工作:准备一个文件用于后面命令的演示,执行date>>test.txt命令四次,给里面写入四行日期时间信息。
options参数:常用的是-F,用来指定分隔符
案例:指定分隔符为冒号,然后进行分隔,分隔之后就有了多列,然后打印前两列。
awk -F: '{print $1,$2}' test.txt
案例:指定多个分隔符,先使用空格分隔,然后再对分隔出来的列继续使用冒号分隔。
awk -F'[ :]' '{print $4,$5,$6}' test.txt
pattern条件模式:其实就是执行指令动作需要满足的条件,类似if(pattern){动作指令脚本};
awk命令主要有以下几种条件模式:
空模式:也是默认模式,即不指定匹配条件,一行一行去处理文本内容。
BEGIN模式:即在文本处理之前,需要执行的操作,比如定义一些变量,给后面使用,或者打印一个表格的表头。
END模式:在处理完文本所有行之后,需要执行的操作。
awk 'BEGIN{print "星期 月份 日期 时间 时区 年份"}{print $0}' test.txt 在正式打印内容之前,先打印一个表头,$0代表打印所有列。
awk 'BEGIN{print "lets begin"}{print $1,$2}END{print "end"}' test.txt 开始处理每一行内容之前,先执行BEGIN操作,打印了lets begin,然后处理每一行,并且打印前两列,处理完全部行之后,再执行EDN操作,打印了end。
awk 'BEGIN{print "定义一个变量line",line=0}{line+=1}END{print line}' test.txt 开始处理文档之前,先打印了一句话,并且定义了一个变量line,给它初始化为0,然后每次处理一行的时候,给line+1,最后处理完毕后,打印出line的值,即行数。
关系运算模式:就是在指定条件时,使用关系运算符。
如:我们取指定的行进行操作
NR是表示行号的变量,我们使用这个变量来对行进行逻辑运算。
如:取第一行只分隔,不做任何动作:awk 'NR==1' test.txt 注意:'NR==1'是指定的执行条件,不是脚本指令,所以不能放到{}中。
如:awk 'NR==1 {print $1}' test.txt 取第一行,然后分隔,然后打印分隔后的第一列。
如:取多行,取第2到第4行 awk 'NR>=2&&NR<=4' test.txt
正则模式:把正则表达式当作条件,满足正则表达式匹配的行才处理。正则表达式放在 // 中
找出有指定关键字的行来处理:awk '/old|hello/' test.txt 代表找出含有old或hello字符的行。
action动作指令:就是你要执行的操作
输出完整的内容:awk '{print $0}' test.txt 所有列用$0代表
打印指定的列:awk '{print $1,$3}' test.txt 打印第一列和第三列
打印最后一列:需要用到一个变量NF,代表最后一列的列数(列数从1开始)。awk '{print $NF}' test.txt
输出总共有多少列:awk '{print NF}' test.txt
输出总共有多少行:使用行数变量NR,如:awk 'END{print NR}' test.txt