前言
Linux的目录结构
Linux的目录结构是一个树型结构
Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘
Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面
Linux路径的描述方式
第一章 基本命令
命令格式
例:ls –la /etc
说明: 1)个别命令使用不遵循此格式
2)当有多个选项时,可以写在一起
比如学习的-a和-l可以组合应用。
•ls -l -a
•ls -la
•ls -al
上述三种写法,都是一样的,表示同时应用-l和-a的功能
3)简化选项与完整选项
-a ↔ -all
目录处理
目录处理命令:ls
命令名称:ls
命令英文原意:list
命令所在路径:/bin/ls
执行权限:所有用户
功能描述:显示目录文件
语法:ls 选项[-ali] [文件或目录]
-a 显示所有文件,包括隐藏文件(-al)
-l 详细信息显示 (-hl,ll) 以列表形式
-i inode,唯一标识 (-il)
所有文件(包括隐藏文件)的详细信息 -la
-h 表示以易于阅读的形式,列出文件大小,如K、M、G
-h选项必须要搭配 -l 一起使用
其中字段:
第1字段
-rw-r--r--
-文件类型:- 二进制文件 d 目录 l 软链接
三个权限位:
rw- r-- r--
u g o
u所有者 g所属组 o其他人
r读 w写 x执行(最高权限,脚本、命令等才需要,权限一般够用就好)
第2字段:文件硬链接数
第3字段:文件(目录)所有者
第4字段:文件(目录)所有者所属组
第5字段:文件大小(字节)
第6字段:文件(目录)最后一次修改(访问)时间
时间:最后一次访问时间、文件状态修改时间、文件数据修改时间
第7字段:文件(目录)名
查看/tmp目录下所有文件(包括隐藏文件)的详细信息,并将命令执行结果保存到“test学号后4位.list”文件中。
ls -la > test0755.list
目录处理命令:cd
命令名称:cd
命令英文原意:change directory
命令所在路径:shell内置命令
执行权限:所有用户
功能描述:cd命令无需选项,只有参数,表示要切换到哪个目录下
语法:cd [Linux路径]
示例:$ cd /tmp/linux/command 切换到指定目录(绝对路径)
$ cd .. 回到上一级目录
$ cd ~ 切换到用户目录 $ cd / 切换到根目录
$ cd - 返回切换到此目录前所在目录
目录处理命令:pwd
通过ls来验证当前的工作目录,其实是不恰当的。我们可以通过pwd命令,来查看当前所在的工作目录
命令名称:pwd
命令英文原意:print working directory
命令所在路径:/bin/pwd
执行权限:所有用户
功能描述:显示当前目录
语法:pwd(无选项,无参数,直接输入pwd即可)
示例:$ pwd
插一句:一般 $ 或者 # 前面也会有当前的工作目录(我们是在这个工作目录下工作)
相对路径和绝对路径
绝对路径:以根目录为起点,描述路径的一种写法,路径描述以/开头
相对路径:以当前目录为起点,描述路径的一种写法,路径描述无需以/开头
特殊路径符
. 表示当前目录,比如 cd ./Desktop 表示切换到当前目录下的Desk top目录内,和cd Desktop效果一致
.. 表示上一级目录,比如:cd .. 即可切换到上一级目录,cd ../.. 切换到上二级的目录
~ 表示HOME目录,比如:cd ~ 即可切换到HOME目录或cd ~/Desktop,切换到HOME内的Desktop
目录处理命令:mkdir
mkdir [-p] Linux路径
命令名称:mkdir
命令英文原意:make directories
命令所在路径:/bin/mkdir
执行权限:所有用户
功能描述:创建新目录 -p 递归创建
语法:mkdir –p [目录名]
•参数必填,表示Linux路径,即要创建的文件夹的路径,相对路径或绝对路径均可
•-p选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录
示例:$ mkdir -p /tmp/linux/command
$ mkdir -p /tmp/linux/ls mkdir /tmp/linux/mkdir
注意:创建文件夹需要修改权限,请确保操作均在HOME目录内,不要在HOME外操作
涉及到权限问题,HOME外无法成功(权限管控的知识)
目录处理命令:rmdir
命令名称:rmdir
命令英文原意:remove empty directories
命令所在路径:/bin/rmdir
执行权限:所有用户
功能描述:删除空目录
语法:rmdir [目录名]
示例:$ rmdir /tmp/linux/command
文件处理
文件处理命令:touch
命令名称:touch
命令所在路径:/bin/touch
执行权限:所有用户
功能描述:创建空文件
语法:touch Linux路径
touch命令无选项,参数必填,表示要创建的文件路径,相对、绝对、特殊路径符均可以使用
示例:$ touch test
文件处理命令:cat
命令名称:cat
命令所在路径:/bin/cat
执行权限:所有用户
功能描述:显示文件内容
语法:cat Linux路径
-n 显示行号
cat同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用
示例:$ cat /etc/passwd
$ cat -n /etc/passwd
文件处理命令:more
more命令同样可以查看文件内容,同cat不同的是:
①cat是直接将内容全部显示出来
②more支持翻页,如果文件内容过多,可以一页页的展示,但不支持查找(less支持查找)
命令名称:more
命令所在路径:/bin/more
执行权限:所有用户
功能描述:分页显示文件内容
语法:more Linux路径
(空格)或 f 翻页
b往回一页显示
(Enter) 换行
q或Q 退出
同样没有选项,只有必填参数,参数表示:被查看的文件路径,相对、绝对、特殊路径符都可以使用
示例:$ more /etc/services
文件处理命令:less
命令名称:less
命令所在路径:/usr/bin/less
执行权限:所有用户
功能描述:分页显示文件内容(可向上翻页)
语法:less [文件名]
↑键 向上一行
键入查找(回车less后输入:/+查找内容)(n 下一个)
示例:$ less /etc/services
文件处理命令:cp
命令名称:cp
命令英文原意:copy
命令所在路径:/bin/cp
执行权限:所有用户
功能描述:复制文件或目录、改名
语法:cp [-rp] 参数1 参数2
参数1,Linux路径,表示被复制的文件或文件夹
参数2,Linux路径,表示要复制去的地方
-r 复制目录(递归复制所有子目录和文件)
-p 保留属性(内容、时间、权限)
示例:$ cp –r
$ cp –rp
复制文件夹,必须使用-r选项,否则不会生效
文件处理命令:mv
命令名称:mv
命令英文原意:move
命令所在路径:/bin/mv
执行权限:所有用户
功能描述:剪切文件、改名
语法:mv 参数1 参数2
示例:$ mv test /tmp/linux/mkdir
参数1,Linux路径,表示被移动的文件或文件夹
参数2,Linux路径,表示要移动去的地方,如果目标不存在,则进行改名,确保目标存在
文件处理命令:rm
命令名称:rm
命令英文原意:remove
命令所在路径:/bin/rm
执行权限:所有用户
功能描述:删除文件、目录
语法:rm [-rf] 参数1 参数2 ..... 参数N
参数1、参数2、......、参数N 表示要删除的文件或文件夹路径,按照空格隔开
-r 删除目录
-f 强制执行删除(只有root管理员用户删除内容会有提示) –i 是否确认删除(弹出提示)
示例:$ rm -r /tmp/linux/mkdir
$ rm –r / -f / -rf / -ri
•可以通过 su - root,并输入密码123456(和普通用户默认一样)临时切换到root用户体验
•通过输入exit命令,退回普通用户。(临时用root,用完记得退出,不要一直用)
如下命令,请千万千万不要在root管理员用户下执行:
rm -rf /
rm -rf /*
效果等同于在Windows上执行C盘格式化。
在不删除目录下所有文件的情况下删除“sub学号后四位”,并在删除前进
行询问确认
每一步都询问(填y)删除的方式
将/etc/passwd文件复制到“sub学号后四位”目录下,重命名为“file2”
一条命令做: cp /etc/passwd file2
支持的通配符
rm命令支持通配符 *,用来做模糊匹配
符号* 表示通配符,即匹配任意内容(包含空),示例:
test*,表示匹配任何以test开头的内容
*test,表示匹配任何以test结尾的内容
*test*,表示匹配任何包含test的内容
文件查找命令
which
我们在前面学习的Linux命令,其实它们的本体就是一个个的二进制可执行程序。
和Windows系统中的.exe文件,是一个意思。我们可以通过which命令,查看所使用的一系列命令的程序文件存放在哪里。
语法:which 要查找的命令
find
在图形化中,我们可以方便的通过系统提供的搜索功能,搜索指定的文件。同样,在Linux系统中,我们可以通过find命令去搜索指定的文件。
语法:find 起始路径 -name "被查找文件"(从根目录开始搜索)
支持的通配符
被查找文件名,支持使用通配符 * 来做模糊查询。
符号* 表示通配符,即匹配任意内容(包含空),示例:
基于通配符的含义,可以结合find命令做文件的模糊查询。
按文件大小查找
语法:find 起始路径 -size +|[kMG]
示例:
grep
可以通过grep命令,从文件中通过关键字过滤文件行。
语法:grep [-n] 关键字 文件路径
第二章节 链接命令、权限、重定向与管道
链接命令:ln
命令名称:ln
命令英文原意:link
命令所在路径:/bin/ln
执行权限:所有用户
功能描述:生成链接文件
语法:ln -s [原文件] [目标文件]
-s 创建软链接
示例:$ ln –s /tmp/Linux/test.list /tmp/test.soft 创建软链接
$ ln /tmp/Linux/test.list /tmp/test.hard 创建硬链接
注意软链接、硬链接的着色方式.
软链接和硬链接各自有什么特点?两者有什么区别?
软链接:类似于Windows中的快捷方式,用的比较多
• 示例:$ ls –l /tmp/Linux/test.list
$ ls –l /tmp/test.soft
• 生成的软链接文件与源文件详细信息(状态)有很大差别
• lrwxrwxrwx l 软连接,权限都为rwxrwxrwx,所有用户都有全部的操作权限
• 执行时还是要找到源文件来执行
• 符号链接:文件很小
• /tmp/Linux/issue.soft -> /etc/issue 箭头指向源文件
硬链接:类似于拷贝,但可同步更新,用的很少
• 示例:$ ls –l /tmp/Linux/test.list
$ ls –l /tmp/test.hard
• 生成的硬链接文件与源文件详细信息是相同的,包括修改时间。
• 不能跨分区,不能针对目录使用
• 硬链接相当于 cp –p + 同步更新
• 示例:$ cat /tmp/Linux/test.list /tmp/test.hard
$ echo “Text at the end of the file” >> /tmp/Linux/test.list
$ cat /tmp/Linux/test.list /tmp/test.hard
区别:删除原件后,硬链接还可以查看、软链接不行。
注意着色显示
示例:$ cat /tmp/Linux/test.list /tmp/test.hard
$ echo “Text at the end of the file” >> /tmp/Linux/test.list
$ cat /tmp/Linux/test.list /tmp/test.hard
$ cat /tmp/Linux/test.list /tmp/test.soft
• 从这个例子看起来,软链接与硬链接似乎也没什么不同。
• 示例:$ rm /tmp/Linux/test.list
$ cat /tmp/test.soft 软链接无法定位到源文件
$ cat /tmp/test.hard 硬链接依然能正常访问
权限管理命令
三个权限位:
rw- r-- r--
u g o
u所有者 g所属组 o其他人
文件: r 可以查看文件内容 w 可以修改文件内容 x 可以执行文件
目录: r 可以列出目录内容 w 可以在目录下创建删除文件 x 可以进入目录
=> 删除一个文件需要的是什么权限?
权限管理命令:chmod
命令名称:chmod
命令英文原意:change the permissions mode of a file
命令所在路径:/bin/chmod
执行权限:所有用户
功能描述:改变文件或目录权限
语法:chmod [ {ugoa} {+-=} {rwx} ] [文件或目录]
[mode=421] [文件或目录]
-R 递归修改
注:只有所有者和root才能使用chmod(sudo)
权限的数字表示 所有者u 所属组g 其他人o 全部用户a
r-- ↔ 100 ↔ 4 -w- ↔ 010 ↔ 2 --x ↔ 001 ↔ 1 rwxrw-r-- ↔ 7 6 4
示例:$ chmod g+w, o-r testfile 赋予文件testfile所属组写权限
$ chmod –R 777 testdir 修改testdir及目录下文件为所有用户具有全部权限
权限管理命令:chown
命令名称:chown
命令英文原意:change file ownership
命令所在路径:/bin/chown
执行权限:所有用户
功能描述:改变文件或目录的所有者(默认只有root才能使用)
语法:chown [用户] [文件或目录]
示例:$ sudo useradd testuser (在改变所有者前需要确定所有者存在)
$ sudo chown testuser testchown.list
权限管理命令:chgrp
命令名称:chgrp
命令英文原意:change file group ownership
命令所在路径:/bin/chgrp
执行权限:所有用户
功能描述:改变文件或目录的所属组(默认只有root才能使用)
语法:chgrp [用户组] [文件或目录]
示例:$ sudo groupadd testgroup (在改变所属组前需要确定所属组存在)
$ sudo chgrp testgroup testchown.list
标准输入输出
重定向符
输出重定向
将原本在标准输出(显示器)上输出的内容改为输出到文件或设备中。
应用:执行日志……
只要是有输出的命令都可以用
示例:$ ls > test.list
$ date > test.list
$ date >> test.list
$ lst 2>> test.list (注:2和>>之间不能有空格)
$ ls &> /dev/null(相当于垃圾箱)
$ ls >> right.list 2>>wrong.list
$ lst >> right.list 2>>wrong.list
使用echo “MODIFIED” >> /tmp/test.hard 命令修改“test.hard”文件
echo “MODIFIED” >> /tmp/test.hard
输入重定向
将执行某些命令的参数从标准输入(键盘),改为文件。
命令格式:命令 < 文件
例:$ wc [选项] [文件名]
可以通过wc命令统计文件的行数、单词数量等。
语法:wc [-c -m -l -w] 文件路径
上图:4行,6个单词,44个字节(包含回车符)
示例:$ wc < test.list
$ wc < test.list > hell
使用wc命令以及输入重定向统计“test学号后4位.list”文件的行数、单词数、
字节数。
wc < /tmp/linux/test0755.list
管道符: |
命令格式:命令1 | 命令2
命令1的正确输出作为命令2的操作对象(命令1报错或没有输出命令2就不能执行)
示例:$ ls –la /etc/ | more
$ ps ax (显示当前系统中的所有进程)
$ ps ax | wc
$ ps ax | grep usr
$ ps ax | grep usr | wc
我们可以通过管道符,把所有要使用的命令串起来,通过不同的命令组合来完成非常
复杂的功能。(与编写一个C程序比较:读进程->取command列->判断是否有usr->计
数器统计,还要调试)
第三章 用户配置文件
用户信息文件 /etc/passwd
用户管理
• 越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度
和服务器操作规范
• 在Linux中主要是通过用户配置文件来查看和修改用户信息
/etc/passwd
• 第1字段:用户名称(不要有特殊符号,统一命名规范,不要太长)
• 第2字段:密码标志(表示这个用户有密码,具体密码在shadow)
• 第3字段:UID(用户ID,数字标识)
0: 超级用户(管理员,UID=0的用户就是管理员)
1-999: 系统用户(伪用户,不能登陆,不能删除)
系统用户不能删除 每一个系统用户都有它后台运行
1000-65535: 普通用户
示例:
man 5 passwd #查看配置文件的帮助信息,注意只打文件名
$ ll /etc/passwd $ ll /etc/shadow #对比两个文件的权限
• 第4字段:GID(用户初始组ID)
• 第5字段:用户说明
• 第6字段:家目录
• 普通用户:/home/用户名/
• 超级用户:/root/
• 第7字段:登陆之后的Shell(命令解释器)
/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(分隔为7个字段,其格式和具体含义:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
其中用户标识号是系统内部用来标识用户的,一般情况下与用户名一一对应.用户标识号中0是超级用户root的标识号;1~99由系统保留,作为管理账号;普通用户从100开始。
如果想将某个用户变成超级用户,应该怎么操作?
将该用户的UID改成0就变成了超级账户
用户与用户组
• 用户:用户名和密码,经过验证后登录到系统后,Linux会为每一个用户启动
一个进程,然后由这个进程接受用户的各种请求。在建立用户的时候,需要
限定其权限,而root用户有权对系统进行任何操作而不受限制。
• 用户组:把几个用户归在一起,相同类型用户的集合。可以设定一个用户组
的权限,那么这个组里的用户就自动拥有了这些权限。Gym rw- file
• Gym –files
初始组和附加组
• 初始组:指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始
组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初
始组。不建议修改初始组。(默认组)
• 附加组:指用户可以加入多个其它的用户组,并拥有这些组的权限,附加组
可以有多个。
• Testuser ->root,bin,gym
Shell
• Linux的命令解释器(命令—解释内核—做出应答->显示在命令操作窗口 )
• 在/etc/passwd当中,除了标准Shell是/bin/bash之外,还可以写如
/sbin/nologin
影子文件/etc/shadow
/etc/shadow:
• 第1字段:用户名
• 第2字段:加密密码
加密算法升级为SHA512散列加密算法
如果密码为是“!!”或“*”代表没有密码,不能登录
• 第3字段:密码最后一次修改日期
使用1970年1月1日作为标准时间,每过一天时间戳加1
• 第4字段:两次密码的修改间隔时间(和第3字段相比)
• 第5字段:密码有效期(和第3字段相比)
• 第6字段:密码修改到期前的警告天数(和第5字段相比)
• 第7字段:密码过期后的宽限天数(和第5字段相比)
0:代表密码过期后立即失效
-1:代表密码永远不会失效
• 第8字段:账号失效时间
要用时间戳表示
• 第9字段:保留
密码有效期99999代表永久有效
密码修改到期前的警告天数为7天
密码到期后的宽限天数为空(因为前面99999已经设置了密码永久有效)
组信息文件/etc/group
/etc/group:
• 第1字段:组名
• 第2字段:组密码标志(组密码放在/etc/gshadow文件)
• 第3字段:GID
• 第4字段:组中附加用户
用户管理相关文件
用户的家目录:初始登录位置,用户在自己家目录中默认拥有所有权限
• 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700
• 超级用户:/root/,所有者和所属组都是root用户,权限是550
用户的邮箱:
• /var/spool/mail/用户名/
• /var:系统中可变数据的保存位置
用户模板目录:
• /etc/skel ($ ls -a)
• 添加用户时自动创建的文件从这里拷贝,设置默认生成文件
第四章 用户与用户组管理
用户添加命令useradd
命令格式:# useradd [选项] 用户名
选项:
-u UID: 手工指定用户的UID号(不推荐)
-d 家目录: 手工指定用户的家目录(ubuntu用-m自动创建家目录)
-c 用户说明: 手工指定用户的说明(有空格要加双引号)
-g 组名: 手工指定用户的初始组(不推荐)
-G 组名: 指定用户的附加组(用“,”分隔)
-s shell: 手工指定用户的登录shell,默认是/bin/bash
示例:
# useradd testuser
# grep testuser /etc/passwd
# grep testuser /etc/shadow
# grep testuser /etc/group
# ll –d /home/testuser/
# useradd –u 550 –G root,bin –d /home/testuser2 -c “test user” –s /bin/bash testuser1
# grep testuser1 /etc/passwd
由于先前useradd没有-m,所以没有创建家目录,也找不到这个目录。
用户默认值文件 /etc/default/useradd
• GROUP=100 #用户默认组
• HOME=/home #用户家目录
• INACTIVE=-1 #密码过期宽限天数(shadow文件第7字段)
• EXPIRE= #密码失效时间(shadow文件第8字段)
• SHELL=/bin/bash #默认shell
• SKEL=/etc/skel #模板目录
• CREATE_MAIL_SPOOL=yes #是否建立邮箱
修改用户密码passwd
命令格式:# passwd [选项] 用户名
选项(不常用):
-S 查询用户密码的密码状态(仅root用户可用)
示例:
# passwd –S testuser
分别对应:用户名,密码,密码设定时间,密码修改间隔时间,密码有效期,警告时间,密码失效时间
# grep testuser /etc/shadow
$ passwd 修改当前用户的密码
实际密码不会存在passwd文件里面(仅为标识),密码存在shadow文件里面(密码经过加密存在里面)。
为什么密码要存放在shadow文件中而不直接存放在passwd文件中?
/etc/passwd 文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了此文件中。
修改用户信息usermod
命令格式:# usermod [选项] 用户名
选项:
-u UID: 修改用户的UID号
-c 用户说明: 修改用户的说明信息
-G 组名: 修改用户的附加组
-L 临时锁定用户(Lock)
-U 解锁用户锁定(Unlock)
示例:
# usermod –c “test user modify” testuser2
# usermod –G root testuser2 (查看uid、gid、groups)
删除用户userdel
命令格式:# userdel [-r] 用户名
选项: -r 删除用户的同时删除用户家目录
示例:# userdel –r testuser1
该条信息代表删除用户成功。信件池未找到是因为添加用户的时候没有加入用户的邮件,所以找不到。
如果我们想不用userdel命令手工删除文件,那么需要修改或删除什么文件或目录?
passwd shadow group gshadow /home/user(用户名)也即家目录 /var/spool/mail/user/
删除/etc/passwd、/etc/shadow、/etc/group中的用户信息。
如果加了-r(再附加删除):删除用户的家目录及相关文件、清理用户的邮件目录。
切换用户身份su
命令格式:# su [选项] 用户名
选项:
- : 选项只是用“-”代表连带用户的环境变量一起切换
-c 命令: 仅执行一次命令,而不切换用户身份
$ su root #错误使用,env命令查看环境变量
示例:
$ su – root #切换成root $ su - ubuntu(切换回普通用户)
$ su – root –c “useradd testuser3”
#不切换成root,但是执行useradd命令添加testuser3用户
#id testuser2
这一行命令的意思是查询并显示 testuser2
用户的身份信息,包括其用户 ID(UID)、所属的主群组 ID(GID)、附加群组等信息。这通常用来确认用户的配置是否正确。
sudo
root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是系统命令
# sudo –s (su – root)
添加用户组groupadd
命令格式:# groupadd [选项] 组名
选项(不常用):
-g GID: 指定组ID
示例:
# groupadd testgroup
# less /etc/group
修改用户组groupmod
命令格式:# groupmod [选项] 组名
选项(不常用):
-g GID: 修改组ID
-n 新组名: 修改组名
示例:
# groupmod –n testgroup group1
但一般会选择删掉再新建
# groupdel group1 (删除时不允许存在初始用户)
修改组名
添加用户或删除用户gpasswd
命令格式:# gpasswd 选项 用户名 组名
选项:
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除
示例:
# gpasswd –a testuser bin
# gpasswd –d testuser bin
第五章 Vim文本编辑器
Vim简介
vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器
同图形化界面中的 文本编辑器一样,vi是命令行下对文本文件进行编辑的绝佳选择。
vim 是 vi 的加强版本,兼容 vi 的所有指令,不仅能编辑文本,而且还具有 shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性。
• Vim是一个功能强大的全屏幕文本编辑器
• 是Linux/UNIX上最常用的文本编辑器
• 它的作用是建立、编辑、显示文本文件
• Vim没有菜单,只有命令
如果需要通过vi/vim编辑器编辑文件(vim兼容全部的vi功能),请通过如下命令:
vim 文件路径 或者是 vi 文件路径
vi\vim编辑器的三种工作模式
注:可能不同系统之间的具体指令会有所不同,但是这几个工作模式都是一样的(概念)。
命令模式(Command mode)
命令模式下,所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能。
此模型下,不能自由进行文本编辑。
输入模式(Insert mode)
也就是所谓的编辑模式、插入模式。
编辑模式没有什么特殊的,进入编辑模式后,任何快捷键都没有作用,就是正常输入文本而已。
此模式下,可以对文件内容进行自由编辑。
底线命令模式(Last line mode)
以:开始,通常用于文件的保存、退出。
命令模式快捷键
常用命令模式快捷键
插入命令
命令 作用
a 在光标所在字符后追加
A 在光标所在行行尾追加
i 在光标所在字符前插入
I 在光标所在行行首插入
o 在光标下插入新行
O 在光标上插入新行
定位命令
命令 作用
:set nu 设置行号
:set nonu 取消行号
gg 到第一行
G 到最后一行
nG 到第n行
:n 到第n行
$ 移至行尾
0 移至行首
删除命令
命令 作用
x 删除光标所在处字符
nx 删除光标所在处后n个字符
dd 删除光标所在行(ndd删除n行)
dG 删除光标所在行到文件末尾内容
D 删除光标所在处到行尾内容
:n1,n2d 删除指定范围的行
复制和剪切命令
命令 作用
yy 复制当前行
nyy 复制当前行以下n行
dd 剪切当前行
ndd 剪切当前行以下n行
p、P 粘贴在当前光标所在行下或行上
替换和取消命令
命令 作用
r 取代光标所在处字符
R 从光标所在处开始替换字符,按Esc结束
u 取消上一步操作
搜索和搜索替换命令
命令 作用
/string 搜索指定字符串(搜索时忽略大小写 :set ic)
n 搜索指定字符串的下一个出现位置
:%s/old/new/g 全文替换指定字符串(c:替换确认)
:n1,n2s/old/new/g 在一定范围内替换指定字符串(c:替换确认)
保存和退出命令
命令 作用
:w 保存修改
:w new_filename 另存为指定文件
:wq 保存修改并退出
ZZ 快捷键,保存修改并退出
:q! 不保存修改退出
:wq! 保存修改并退出(文件所有者及root可使用)
使用技巧
• 导入命令执行结果::r 文件名 :! 命令 :r !命令
示例::r /etc/issue
:! date
:r !date
• 定义快捷键::map 快捷键 出发命令
示例::map ^B 0x
Ctrl v B(^B打法)
• 连续行注释 :n1,n2s/^/#/g ( ^ 表示行首,即在行首插入一个 # )
:n1,n2s/^/\/\//g(每输入一个 / 需要前面加上反斜杠 \ )
• 替换 :ab mymail(被替换) sample@email.com(替换) (输入mymail后按空格变化)
当输入被替换字符时,空格后换成被替换项(输出mymail,回车、空格后自动变成sample@email.com)
第六章 Shell
Shell概述
Shell
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行
程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些
程序。(其实就是现在的交互界面)
• Shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强。
• Shell是解释执行的脚本语言。(不需要单独进行编译,命令在执行过程中自
动编译)
• 在Shell中可以直接调用Linux系统命令,可以非常方便地帮助用户进行系统管
理。
Shell的分类
• Shell的两种主要语法类型有Bourne和C。
• Bourne Shell:从1979年起Unix就开始使用Bourne Shell,Bourne Shell的主
文件名为sh
• C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而
得名。
• 这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;
C家族主要包括csh、tcsh。
• Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell
• Linux支持的Shell:vi /etc/shells
Shell脚本的执行方式
echo输出命令
可以使用echo命令在命令行内输出指定内容
命令格式:# echo [选项] 输出内容
选项: -e 支持反斜线控制的字符转换
示例:
# echo ‘hello world’
# echo “abc”
# echo –e “ab\bc” 删除左侧字符
# echo –e “a\tb\tc\nd\te\tf” 制表符(Tab)与换行符
# echo –e “\e[1;31m abcd \e[0m” 输出颜色(30-37)
带有空格或\等特殊符号,建议使用双引号包围。因为不包围的话,空格后很容易被识别为参数2。
反引号`
看一下如下命令:echo pwd
本意是想,输出当前的工作路径,但是pwd被作为普通字符输出了。
我们可以通过将命令用反引号(通常也称之为飘号)`将其包围
被`包围的内容,会被作为命令执行,而非普通字符
第一个脚本
示例:
# vi hello.sh 可告诉系统要编写Bash脚本,用vim会尝试用颜色来帮助
#!/bin/bash 不是注释,标称以下写的语句是Bash脚本
# The first program 注释
# Author: yourname (E-mail: yourname@email.com) 注释
echo “ This is YOUR NAME’s first program.”
脚本执行
• 赋予执行权限,直接运行(常用)
• chmod 755 hello.sh
• 绝对路径 执行
• 相对路径 ./hello.sh 执行
• 通过Bash调用执行脚本
执行脚本
1.找到脚本本身(提供绝对路径或相对路径找);
2.若不写路径,会从PATH中找。
• bash hello.sh
bash hello.sh 1 2 3 (往脚本里面传递三个参数,这些参数将被脚本中的程序使用)
示例:
# chmod 755 hello.sh
# ./hello.sh
第七章 Bash的基本功能
历史命令与命令补全
命令格式:# history [选项] [历史命令保存文件]
选项:
-c 清空历史命令(缓存中的)
-w 把缓存中的历史命令写入历史命令保存文件 ~\.bash_history
.bash_history路径在 ~/.bash_history
这里面存放的是开机前的历史命令,开机后执行的历史命令不在这个文件中保存。若需要立即保存,则使用指令加-w
示例:
# history
# history -w # vi .bash_history
# history –c # vi .bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
(HISTSIZE)
历史命令的调用
• 使用上、下箭头调用以前的历史命令
• 使用“!n”重复执行第n条历史命令
• 使用“!!”重复执行上一条命令
• 使用“!字串”重复执行最后一条以该字串开头的命令
命令与文件补全
• 在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令 或文件时,按“Tab”键就会自动进行补全
• 按一次Tab 与 按两次Tab
命令别名与快捷键
命令格式:# alias 别名=‘原命令’
示例:
# alias
# alias rm=‘rm -i’
# alias
# unalias rm 删除别名
# alias
注意除非确定需要覆盖系统命令,否则自己定义的别名不应该与原始命令重叠, 这会导致原始命令无法使用。(修改.bashrc 让别名永久生效)
第八章 Bash的变量
变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一
些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变
量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获
知用户相关设置,变量也可以用于保存暂时信息。
变量设置规则
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
环境变量名建议大写,便于区分。
示例:
# name=yourname
# 1name=yourname
# name=“your name”
# name=$(date)
变量分类
用户自定义变量:最常用变量,变量名和变量值都可以自由定义。
环境变量:这种变量主要保存的是和系统操作环境相关的数据。系统固定的
系统环境变量名称不能更改,但值可以更改,且用户可以定义新的环境变量。
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名
不能自定义,变量作用是固定的。(其实是预定义变量的一种)
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也
是固定的。
用户自定义变量
• 变量定义:
# name=“your name” 命令结果 name=`赋予变量`(反引号)
• 变量调用:
# echo $name或者 echo "$name"
打印变量值 echo "$变量"或者 echo $变量
• 变量叠加:
# test=123
# test=“$test”456
# test=${test}789
结果为123456789
• 变量查看(系统当中所有的变量):
# set
# set | less:
• 变量删除:
# unset name
环境变量
• 用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。
• 如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
• 声明变量:
• # export 变量名=变量值
• # export 变量名
• 查询变量
• env (注意与set的区别)
• 删除变量
• unset 变量名
• 变量调用:
# echo $变量名
示例:
# bash 在当前shell当中再启用一个新的bash(子shell)
# pstree | grep bash 显示进程树
# exit 退出当前shell
# pstree | grep bash
# name = yourname # export age = 18
# sex = male/female # export sex
# set # bash # env
# echo $sex # unset sex
# exit 退出shell(bash)
系统常见环境变量
PATH:系统查找命令的路径
执行脚本
1.找到脚本本身(提供绝对路径或相对路径找);
2.若不写路径,会从PATH中找。
执行命令同理.
示例:# echo $PATH
: 分隔符
# lst 错误命令
# cp hello.sh /bin/
# hello.sh 此时不需要打全绝对路径,可以用Tab自动补全
# rm –rf /bin/hello.sh
# PATH=“$PATH”:/tmp/sh PATH变量叠加 或者 PATH=${PATH}:temp
# hello.sh
位置参数变量
这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作
用是固定的。
示例:
$ vi parameter1.sh
#!/bin/sh
echo $0
echo $1
echo $2
echo $3
$ chmod 755 parameter1.sh
$ ./parameter1.sh 11 22 33
示例:
$ vi parameter2.sh
#!/bin/sh
num1=$1
num2=$2
sum=$(($num1+$num2)) #数值运算的标准格式 第一个参数和第二个参数相加
echo $sum(echo $?输出是0代表输出正确 输出的值是代号,代表输出的某种状态)
$ chmod 755 parameter2.sh
$ ./parameter2.sh 11 22
示例:
$ vi parameter3.sh
#!/bin/sh
echo “A total of $# parameters”
echo “The parameter is: $*”
echo “The parameters is: $@”
$ chmod 755 parameter3.sh
$ ./parameter2.sh 11 22
示例:
$ vi parameter4.sh
#!/bin/sh
for i in “$*”
do
echo $i
done
for y in “$@”
do
echo $y
done
$ chmod 755 parameter3.sh
$ ./parameter4.sh 1 2 3 4
预定义变量
echo $? 输出是0代表输出正确;不是0时,输出的值对应着输出的某种错误状态。
示例:
# ls
# echo $?
# lst
# echo $?
# ls wrongfile
# echo $?
示例:
# !/bin/bash
# Author: yourname
echo ”The current process is $$”
输出当前进程的PID,即当前脚本执行时生成的进程的PID
find /tmp/sh –name hello.sh &
使用find在root目录下查找hello.sh文件,符号&的意思是把命令放入后台执行。
echo “The last one process is $!”
第九章 数值运算与运算符
declare声明变量类型
命令格式:declare [+/-] [选项] 变量名
- 给变量设定类型属性
+ 取消变量的类型属性
-i 将变量声明为整数型(integer)
-x 将变量声明为环境变量
-p 显示指定变量的被声明的类型
“权限不够”
示例:命令 选项 目录/文件/字符串/变量 rm–rf*
# declare –p a
# export a
# declare –p a
示例:
# c=11
# d=22
# declare -i e=$c+$d
expr或let数值运算工具
let
let命令和双小括号(()),在数学计算方面功能一样,但是没有(())的功能强大,let只能用于赋值计算,不能直接输出,不可以和if条件判断一起使用。
(1)语法功能等价于((表达式)),let后面的整数运算表达式中变量不需要加$,特殊字符前也不需要加“\”。
(2)多个表达式之间使用空格,而不是","号。
(3)对于类似let a+b这样的写法,Shell虽然计算了a+b的值,但却将结果丢弃,如果echo let a+b会直接输出字符串a+b;若不想这样,可以使用let sum=a+b将a+b的结果保存在变量sum中。
expr
expr(evaluate expressions)命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作。
expr 参数1 操作运算符 参数2
expr substr 字符串 startNodeendNode从1开始,后面包含
expr index 被查找的字符串 需要查找的字符
expr match 字符串 正则表达式
expr 字符串 :正则表达式
示例:
$ expr 30 \* 3
$ expr length "xxxxx“
示例:
$ a=4
$ let a+=2
$ echo $a
$ c=11
$ d=22
$ f=$(expr $c + $d)
$ echo $f
“$((运算式))”或”$[运算式]”
1)括号内赋值:((变量名=整数表达式))
2)括号外赋值:变量名=$((整数表达式))
3)多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式2...))
4)与if条件句配合使用:if((整数表达式))
示例:
运算符
示例:
# c=$(( (11+3)*3/2 ))
# d=$(( 14%3 ))
# e=$(( 1&&0 ))
第十章 通配符与其它特殊符号
通配符
示例:
# rm -rf * 删除当前目录下的所有文件
其它特殊符号
示例:
文件搜索命令
find
搭配对象:通配符
命令名称:find
命令所在路径:/bin/find
执行权限:所有用户
语法:find [搜索范围] [匹配条件]
功能描述:文件搜索(所有类型的文件,包括目录、普通文件、符号链接等)
-i 不区分大小写
-name
参数指定查找的文件名,可以使用通配符匹配多个文件。
-iname
示例:权限不够 sudosu-root
# find /etc -name init在目录/etc中查找文件init(-iname不区分大小写)
# find /etc -name *init*
# find /etc -name init???
最好用""来包括文件名
示例:
# find / -size +204800(数据块)在根目录下查找大于100MB的文件
或者写成 find / -size +100M
(+n 大于 -n 小于 n 等于(即什么符号都不加,精准匹配))
数据块:512字节0.5k 100MB=102400KB=204800(1k等于两个数据块)
# find / -user gym 在根目录下查找所有者为gym的文件(-group 所属组)
# find /etc -cmin -5 在/etc下查找5分钟内被修改过属性的文件和目录
(-amin 访问时间 access -cmin 文件属性\状态 change -mmin 文件内容 modify)
(+n 超过n分钟-n -n n分钟之内)
所属目录也会显示出来
示例:
# find / -size +163840 -a -size -204800
在根目录下查找大于80MB小于100MB的文件
(-a 两个条件同时满足 and -o 两个条件满足任意一个即可 or)
# find /etc-name init* -a -type d
(-type:f 文件 d 目录 l 软链接文件 -type f
:只查找普通文件,忽略目录、符号链接、设备文件等。)
找到/etc下后缀为.conf的文件
列出/etc下大于1K小于5K的文件
最好加-o
在/etc下查找5分钟内被访问过的目录
grep
搭配对象:正则表达式
命令名称:grep
命令所在路径:/bin/grep
执行权限:所有用户
语法:grep [选项] [指定字串] [文件]
功能描述:在文件中搜寻字符串匹配的行并输出
-i 不区分大小写 -v 排除指定字串
-n 显示匹配的行号 -c 统计匹配的行数
-q 静默模式,不输出任何信息
--color=auto对匹配到的文本着色显示
示例:
# grep ‘root’/etc/passwd ($USER-v )
# grep “Root” /etc/passwd (-i)
示例:统计。。用户有多少个 -> grep–c 行
默认区分大小
# grep -q “ROOT” /etc/passwd(-qi echo $?)
在/etc/passwd中查找默认shell为/bin/bash的用户,显示行号,着色显示.
红色是因为(alias命令查看) 该命令加了--color=auto 可以用unalias修改
统计默认shell为/sbin/nologin的用户个数。
第十一章 正则表达式
正则表达式与通配符
• 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等文本处理命令可以支持正则表达式。
• 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,只能用shell自己的通配符来进行匹配。
• 文件:find ls cp 文件处理命令 通配符
• 字符串: grep awk sed 字符串处理命令 正则表达式
• REGRXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。
• 文件处理命令(ls find)+ 通配符
• 字符串处理命令(grepawksed) + 正则表达式
字符集和单词
与前面的功能不同
^ $ 用来匹配位置 \{ 赋予大括号特殊意义 \{,n\} 小于等于
. 匹配除了换行符外任意一个字符
贪婪模式
示例:
# grep“.at” /usr/share/dict/words匹配at前有一个字符的字符串
# grep a..c /usr/share/dict/words匹配a和c之间有两个字符的字符串
# grep ..\’s /usr/share/dict/words 转义符匹配.(字符转义)
# ls | grep …匹配连续的三个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符(反义)
示例:
# grep [abc]at /usr/share/dict/words匹配at前有a或b或c的字符串
# grep [A-Z]i[a-z] /usr/share/dict/words
# grepa[a-zA-Z]lists /usr/share/dict/words #
[a-zA-Z]
:然后匹配任何一个大小写字母(即,任何一个从 "a" 到 "z" 或从 "A" 到 "Z" 的字母)。这是一个字符类,匹配指定范围内的任意单个字符。
# ls | grep [0-9]abc
# grep ltman/usr/share/dict/words
# grep [^A-Z]ltman/usr/share/dict/words
# grep [^abcxyz]list\’s /usr/share/dict/words
字符类
注意有两个中括号
找出words中以“大写字母’s”结尾的单词[[:upper:]]\‘s$
重复
“*”表示在它前面的模式(pattern)应该重复0次或多次“.{2,4}”
“+”指定重复 1 次或更多次
“?”指定重复0次或 1 次
“{}”可以明确指定模式重复的次数
“{n}”重复n次
“{n,}”重复n次或更多次
“{n,m}”重复不少于n次,不多于m次
示例:
在/tmp目录下创建“google学号后四位”文件
”google学号“文件内容:
当使用 grep "ax*b"
来匹配字符串 'abb'
时,x*
部分匹配了零个 x
,所以整个模式就匹配了 ab
。
这个模式 ax*b
可以匹配 ab
、axb
、axxb
、axxxb
等等,因为 x*
表示 x
可以出现任意次数,包括零次。所以它成功地匹配了你的输入 abb
中的 ab
部分。也即x*要看成一个整体。
检查文件系统已用占比
位置匹配
^ 匹配行首$ 匹配行尾^$匹配空行
[^] 匹配指定范围外的任意单个字符(反义)
示例
找出words中以“大写字母’s”结尾的单词[[:upper:]]\‘s$
两个a之间有两个字母 a..a
子表达式、逆向引用和分支
“()”将一个或多个字符捆绑在一起,当做一个整体进行处理,子表达式子表达式匹配到的字符串会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1, \2, \3, ……
“\1”表示从左侧起第一个子表达式匹配到的字符串(模式匹配的结果)
逆向引用:引用前面的子表达式所匹配字符串
分支:“|”表示“或”例:以a或b开头的行 ^a|^b.*
示例:
# echo codecodecode | egrep “code{3}”
# echo codeee | egrep “code{3}”
# echo codecodecode | egrep “(code){3}”
# echo rootxxrbbt | egrep “(r..t).*\1”
# echo rootxxroot | egrep “(r..t).*\1”
^:表示非是在括号里面,而括号外面的表示开头。
注意匹配范围
egrep和grep默认使用贪婪匹配模式
将第3、4题命令补充完整,使正则表达式可完整匹配整个字符串,要求使用重复匹配、子表达式和逆向引用:
3. $ echo cococooxocococo | egrep ”(co)+oxo(co)+” egrep “(co){3}.*\1”
4. $ echo roor??foof-x-foof??roor | egrep "(r..r)(.*)(f..f)-x-\3\2\1" egrep “^(roor)\?{2}(foot)-x-\2\?\?\1”
5. 显示/etc/brltty/Text/ltr-alias.tti文件中前21行的注释,排除全是#的行
head 命令可用于查看文件的开头部分的内容,有一个常用的参数-n 用于显示行数,默认为10,即显示10 行的内容。也要排除最后一行(不是注释)
查找/usr/share/dict/words中包含“以to开始并以to结尾”的单词
egrep ‘(to)|(^to.*to$)’ words
找出/proc/meminfo中kB前不是0的行
匹配date命令中的时间(XX:XX:XX A/PM)
找出并显示/proc/meminfo中包含mem或active的参数的行,不区分大小写,显示行号
|前后是各自整体
字符截取命令
grep:从文本中提取字符串,其实也是字符截取命令
除此之外,主要的字符截取命令为cut,awk和sed。
区别:grep是在文件中提取符合条件的行,而cut和awk可以提取
符合条件的列。
有行有列,最终就能提取符合条件的字符串,因此grep和cut经常
结合使用。
grep
命令名称:grep
命令所在路径:/bin/grep
执行权限:所有用户
语法:grep [选项] [指定字串] [文件]
功能描述:在文件中搜寻字符串匹配的行并输出
-i 不区分大小写 -v 排除指定字串
--color=auto 对匹配到的文本着色显示
-n 显示匹配的行号 -c 统计匹配的行数
-q 静默模式,不输出任何信息
示例:
# grep $(whoami) /etc/passwd ($USER -v )
# grep “Root” /etc/passwd (-i)
# cat -n /etc/passwd | grep root
# grep -ni “ROOT” /etc/passwd (-ci)
# grep -q “ROOT” /etc/passwd (-qi echo $?)
找出~/.bashrc中非注释的语句
找出~/.bashrc中以HIST开头的变量
赋值语句
找出~/.bashrc中包含PS1、PS2、PS3、PS4变量(若有)的语句
找出~/.bashrc中包含选项(-一个字母或多个字母,例如“-a”)的语句
写出能判断/etc/passwd中哪些行是用户名和最后一个单词(注意是单词不是字段)相同的行的程序。如上面创建的sh用户对应的行
“+”指定重复 1 次或更多次.
“.”匹配除了换行符外任意一个字符.
cut字段提取命令
示例:cut和grep结合使用
批量删除普通用户,需要所有普通用户的用户名
如果根分区使用率超过80%,报警提示
df -h
用于显示文件系统的磁盘空间使用情况,-h
选项告诉 df
命令以以易读的单位(如 GB、MB)显示磁盘使用情况,而不是以字节为单位。
cut的局限性:只擅长处理“以一个字符间隔”的文本内容,需要用更复杂的awk命令来提取,但如果能用cut解决问题尽量用cut。
当一个文件中每一行都含有一个或多个空格时,这时候只能用 awk 来分隔
cut默认的分隔符是制表符,awk默认的分隔符是一个空格或者多个空格或者是制表符
printf命令
命令名称:printf
语法: printf “输出类型输出格式” 输出内容
功能描述:格式化打印命令,最常用在awk命令中的标准输出格式
输出类型: %ns:输出字符串。n是数字,指代输出几个字符。
%ni:输出整数。n是数字,指代输出几个数字。
%m.nf:输出浮点数。m和n是数字,指代输出的整数位和小数位数。
如 %8.2f 代表共输出8位数,其中2位是小数,6位是整数。
输出格式: \a:输出警告声音 \b:输出退格键(Backspace键)
\f:清除屏幕 \n:换行
\r:回车(Enter键) \t:制表符(Tab键)
\v:垂直的制表符(Tab键)
示例:
printf 不会像cat等命令一样自动调整输出格式,不能直接显示文件内容,且不能接受
管道输出。
示范:
在awk命令的输出中支持print和printf命令:
print:print会在每个输出之后自动加入一个换行符(Linux默认没有
print命令)
printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要
换行,需要手工加入换行符。
awk命令
语法:awk ‘条件1{动作1} 条件2{动作2}……’ 文件名
条件(Pattern):一般使用关系表达式作为条件
x>10 x>=10 x<=10……
动作(Action):格式化输出 流程控制语句
默认分隔符为一个或多个空格或制表符
BEGIN:在真正的动作执行前先做一个动作
FS内置变量:指定分隔符;OFS内置变量:指定输出时的分隔符。
NR内置变量:存行号;$NF内置变量:存最后一个字段,$(NF -1)倒数第二个字段
END:在所有动作执行完后最后执行一个动作
示例:这时printf不再是系统命令,而是awk中的动作命令,但基本使用方法相同。
# awk ‘{print $1 $4}’ info学号后四位 $1:awk内置变量,存第一列($0存整行)
# awk ‘{prinf $1 “\t” $4 “\n”}’ info 没有条件,则对所有数据都进行这个动作
awk每次读取一行,再从行中提取指定的列。
root没有分割,因为需要拿出一行来执行动作。所以需要BEGIN,在实际分割前生效。
sed
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。
sed主要是用来将数据进行选取、替换、删除、新增的命令。
v.s. Vi编辑器:
vi只能修改文件,不能修改命令执行的结果
sed既可以修改文件,也可以通过管道符接收命令执行的结果来进行修改。
sed更多运用在对命令的结果进行修改,常用在shell脚本中作为流数据的处理
编辑器。命令1 | 命令2
命令名称:sed
语法: sed [选项] ‘[动作]’ 文件名
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-i :用sed的修改结果直接修改读取数据的文件,而不是由显示器输出。
-e: 允许对输入数据应用多条sed命令编辑
实例:sed -e ‘s/Tom/new/g ; s/Jerry//g’ info
sed '2x No such' x为符号对应的位置 2可以是随意改变(根据文件行数)
sed '/被操作的行/x 字符' info 数字可以是随意改变(根据文件行数) 被操作的行可以输入特征字符来定位到所对应的行
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
i \:插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
sed '2,4d' 文件
sed '3,5{/被替换的字符/x}' info 数字可以是随意改变(根据文件行数)
d : 删除,删除指定的行。
p : 打印,输出指定的行。
s : 字串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和vi中的替换格式类似,g表示全局)
三类可叠加使用
sed处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。
,$d:
删除包含“Jerry”这个词及其后面所有内容的行。$表示行尾,所以/$d表示匹配到文件末尾,然后执行删除操作。!d:
删除除了包含前面指定的词的行之外的所有行。- ’5s/95/88/g‘:改这一行所有字符值为95的列为88。
- ’5s/95/88/‘:改这一行第一个匹配到的字符值为95的列为88。
- ’5s/95/88/2‘:改这一行第二个匹配到的字符值为95的列为88。
打印3到10行
打印以‘system’或‘syslog’开头的行,并按UID正序排序。
删除包含’/bin/sh’的行.
删除sync用户的行以及这之后的10行.
一定要加上+号,不然显示错误
删除15-20行中所有的数字。
g全局
将所有系统用户的shell改为普通用户的shell,可使用多条命令
1-999 系统用户
sed -i '/^[^:]*:[^:]*:[0-9]\{1,3\}:[^:]*:/s/:[^:]*$/:\/bin\/bash/' /tmp/passwd
在所有普通用户前一行插入“REGULAR”,在所有系统用户前一行插入“SYSTEM”,用一条命令完成,修改文件。
在默认shell不是bash、sh和nologin的用户后一行追加“# SPECIAL”,修改文件。
将最后一列删掉,包括“:”
第十二章 字符处理命令
sort排序命令
语法: sort [选项] 文件名
选项: -n : 以数值型进行排序,默认使用字符串型排序
-r : 反向排序
-t : 指定分隔符
-k n[,m] : 按照指定的字段范围排序。从第n个字段开始,m字段结束(默认到行尾)
示例:
# sort /etc/passwd # sort -t “:” -k 3,3 /etc/passwd
# sort -r /etc/passwd # sort -n -t “:” -k 3,3 /etc/passwd
将所有以大写字母开头的行删掉,修改文件。
wc统计命令
语法: wc [选项] 文件名
选项: -l : 只统计行数
-w : 只统计单词数
-m : 只统计字符数
-c : 只统计字节数
示例:
第十三章 条件判断
在正常情况下,Shell按顺序执行每一条语句,直至碰到文件尾。
但在大多数情况下,需要根据情况选择相应的语句执行,或者对一段程序循环执行。这些都是通过控制语句实现的。
if命令判断条件是否成立,进而决定是否执行相关的语句。
测试条件是否成立:测试条件有哪些?
按照文件类型进行判断
-d -e -f -L
示例:
echo $? 输出是0代表输出正确 输出的值是代号,代表输出的某种状态
第一个判断命令如果正确执行,则打印yes,否则打印no
按照文件权限进行判断
-r -w -x
示例:
第一个判断命令如果正确执行,则打印yes,否则打印no,但无法判断是所有者、所属组还是其他人拥有写权限。
两个文件之间进行比较
示例:
[ /tmp/sh/info -ef /tmp/info ] && echo “yes” || echo “no”
识别硬链接文件
硬链接的lnode跟原文件一样吗?软链接呢?
-
硬链接:
- 硬链接的inode与原文件的inode是完全相同的。这意味着硬链接和它所链接的原始文件实际上引用的是文件系统中的同一个存储位置。因此,修改硬链接文件的内容会直接影响原始文件,反之亦然。
- 删除硬链接之一不会删除文件内容,只有当所有指向该inode的链接都被删除时,文件内容才会被文件系统回收。
-
软链接:
- 软链接(符号链接)有自己独立的inode。软链接实际上是一个特殊类型的文件,其中包含了它所指向的目标文件或目录的路径名。因此,软链接的inode与其目标文件的inode是不同的。
- 如果你修改了软链接的内容(实际上是修改链接路径),这不会影响到原始文件。如果删除了原始文件,软链接将变成一个指向不存在路径的“悬空”链接。
总结来说,硬链接的inode与原文件一样,软链接的inode与原文件则不一样。
两个整数之间进行比较
示例:
字符串的判断
示例:
多重条件判断
示例:
第十四章 流程控制
单分支if条件语句
格式:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意:
if 语句使用 fi 结尾,和一般语言使用大括号或符号结尾不同
[ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分隔,也可
以换行写入,不用“;”。
示例:判断根分区使用率
#!/bin/bash
rate=$(df -h | grep “/dev/sda5” | awk ‘{print $5}’ | cut -d “%” -f 1)
if [ $rate -ge 10 ]
then
echo “Warning! /dev/sda5 is full!!”
fi
# chmod 755 df.sh
# ./df.sh
双分支if条件语句
格式:
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
格式:
if [ 条件判断式1 ]
then
条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
条件判断式2成立时,执行程序2
else
当所有条件不成立时,最后执行此程序
fi
预定义变量
接收键盘输入:
命令名称:read
语法:read [选项] [变量名]
-p “提示信息” 在等待read输入时,输出提示信息
-t 秒数read命令会一直等待用户输入,此选项可以指定等待时间
-n 字符数read命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
exit命令
命令名称:exit
命令描述:强行退出一个脚本,并且向调用这个脚本的进程返回一个整数值。
语法:exit [整数值]
在一个进程成功运行后,总是向父进程返回数值0。其它非零返回值都表示发生了
某种异常。
父进程可以定义一些操作来处理子进程的异常退出(通过判断返回值是什么)。
示例:
判断用户输入的是什么文件
#!/bin/bash
read -p “Please input a filename: “ –t 30 –n 4 file //接收键盘的输入,并赋予变量file
if [ -z “$file” ]
then
echo “Error, please input a filename!”
exit 1
elif [ ! -e “$file” ]
then
echo “Your input is not a file!”
exit 2
elif [ -f “$file” ]
then
echo “$file is a regular file!”
elif [ -d “$file” ]
then
echo “$file is a directory!”
else
echo “$file is not a regular file or a directory!”
fi
# chmod 755 file.sh
# ./file.sh
多分支case条件语句
case语句和if…elif…else语句一样都是多分支条件语句
但和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
一旦遇到“;;”就跳转到case结构的最后。如果有多个模式都匹配变量,那么只会执行第一条匹配模式对应的程序。
“*)”放在开头:无论输入什么都会执行其中的程序。(顺序很重要)
格式:
case $变量名 in
*)
如果变量的值都不是以上的值,则执行此程序
;;
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
esac (倒过来的case,用来结束case条件语句)
示例:判断用户输入 多分支case条件语句
#!/bin/bash
read -p “Please choose 1 or 2 or 3: “ -t 30 op
case $op in
“1”)
echo “Your option is 1!”
;;
“2”)
echo “Your option is 2!”
;;
“3”)
echo “Your option is 3!”
;;
*)
echo “ERROR!”
;;
esac
while循环
循环结构用于反复执行一段语句,shell中的循环结构有3种,while、until和
for。
while循环是不定循环,也称作条件循环。
只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才
会停止。
格式:
while [ 条件判断式 ]
do
程序
done