eth0之类的配置,静态ip配置 setup
如:ls
, cd
, rm
, mv
等
特别的:
su
:切换用户
命令:# bash
su - tom
对一个用户的修改其实就是对3个文件的内容进行修改:
passwd、shadow、group
增加:
刚刚创建的账户,默认是锁定状态,不能登录
语法:useradd [选项] {UserName}
选项:
命令 | 解释 |
---|---|
-c comment | 对一个账户进行描述,也可以当作备注 |
-d 目录 | 指定用户主目录,如果目录不存在,则同时使用-m选项,可以创建主目录 |
-g 用户组 | 指定用户所属的用户组。 |
-G 用户组,用户组 | 指定用户所属的附加组。 |
-s Shell文件 | 指定用户的登录Shell,nologin的shell程序是不允许登录。 |
-u 用户号 | 指定用户的用户号 |
所属用户组:通常情况下,指的是一个用户的主组(主工作组)。
所属附加组:一般指的是,一个账户已有一个主组,又给账户增加了一个或多个的组,这些就被称之为附加组。
创建一个账户的时候,如果没有指定他的主组信息,那么系统将默认为其创建一个同名的用户组,该账户的主组就是同名的用户组。
案例:
命令:# bash
useradd tom
2.创建一个用户,并指定它的家目录
1)先创建父目录文件夹
2)命令:# bash
useradd -d /big1908/lwchang -m lwchang
3.创建一个账户,为其指定主组tom
命令:# bash
useradd -g tom piao
-g 命令是为用户指定一个用户组,-g 主用户组,用户组 多出来的用户组为附加组,一般是已有用户组的用户才添加附加组,此时tom为主用户组,piao为附加组
命令:# bash
useradd -G tom,jerry cao
查看group中,创建了cao用户组
命令:# bash
useradd -s /sbin/nologin tom1
命令:# bash
useradd -u 10000 alex
修改:
语法:usermod[选项]{UserName}
选项:
命令 | 解释 |
---|---|
-c comment | 对一个账户进行描述,也可以当作备注 |
-d 目录 | 指定用户主目录,如果目录不存在,则同时使用-m选项,可以创建主目录 |
-g 用户组 | 指定用户所属的用户组。 |
-G 用户组,用户组 | 指定用户所属的附加组。 |
-s Shell文件 | 指定用户的登录Shell,nologin的shell程序是不允许登录。 |
-u 用户号 | 指定用户的用户号 |
案例:
命令:# bash
usermod -d /jack -m -g root -G tom,jerry -s /bin/sh -u 506 jack
解释:
命令 | 注释 |
---|---|
usermod | 修改 |
-d /jack-m | 指定用户的家目录 由于/jack目录不存在,所以-m |
-g root | 用户的主组信息(主要工作部门) |
-G tom,jerry | 两个附加组 |
-s /bin/sh | 用户的shell程序。登录系统之后,系统为其分配的程序。 |
-u 506 | 指定账户的UID |
jack | 指明哪个账户被执行修改 |
删除:
选项 | 注释 |
---|---|
-r | 删除账户的同时,一并删除账户的所有资料信息 |
增加:
语法:groupadd [选项] {GroupName}
选项:
选项 | 注释 |
---|---|
-g | 指定GID |
-o | 允许新建组的ID与系统中已存在的组的GID相同 |
修改:
选项 | 注释 |
---|---|
-g | 指定GID |
-o | 允许新建组的ID与系统中已存在的组的GID相同 |
-n | 用来修改groupName |
删除:
选项 | 注释 |
---|---|
-l | 锁定 |
-u | 解锁 |
-d | 删除密码 |
指令 | 注释 |
---|---|
su {UserName} | 依然使用当前账户的环境变量 |
su - {UserName} | 标识切换用户之后,使用对应的账户的环境变量 |
su - | 命令可以直接切换到root账户,需要输入root的密码 |
在Linux系统中,把所有的内容都当作文件处理,文件夹被当作是目录文件。硬盘被当作时块设备文件。
所有文件都固定有三组权限,
第一组永远是用户的权限,
第二组永远是组的权限,
第三组永远是其他人的权限。
每一个文件都有10个标识位,第一个标识位用来标识该文件的类型,例如,普通文件或目录文件。
权限标识符的位置,永远都不会发生变化
标识位 | 注释 |
---|---|
d | 表示目录文件 |
- | 表示普通文件 |
解释:
除了第一个以外,剩余的9个标识位,每三个为一组(对应上面的第一、二、三组)。
每一组中的三个标识分别是:
第一个:读
第二个:写
第三个:执行
读、写、执行分别又对应了字符、数字的权限表示方法:
字符 | 权限 | 数字 |
---|---|---|
r | 读 | 4 |
w | 写 | 2 |
x | 执行 | 1 |
修改权限的命令是:
选项 | 注释 |
---|---|
-r | 一般用作目录时是使用 |
修改文件属主和属组的命令:
如果被物理权限修饰的文件,即使是root账户也无权进行删除、修改的操作。
命令可以用来锁定某个文件不能被修改。系统内核2.6以上的版本支持。
可以通过命令来修改文件的物理属性从而提高系统的安全性。
但不能改保护 /、/dev、/tmp、 /var目录
命令用法:
选项:
选项 | 解释 |
---|---|
-a | 让文件或目录仅供附加用途(通常用于日志文件的修饰) |
-i | 不得任意更改文件或目录(通常用于配置文件的修饰) |
-s | 保密性删除文件或目录(直接删除硬盘上的数据) |
-S | 即时更新文件或目录(直接存入硬盘计算机工作原理其中之一是写入缓存,在写入硬盘) |
-u | 预防意外删除(数据依然存在硬盘上,用于数据恢复) |
-R | 递归处理,将指令目录下的所有文件及子目录一并处理 |
-v<版本编号> | 设置文件或目录版本 |
-V | 显示指令执行过程 |
+<属性> | 开启文件或目录的该项属性(表示开启权限) |
-<属性> | 关闭文件或目录的该项属性(表示关闭权限) |
=<属性> | 指定文件或目录的该项属性 |
案例:
#bash
touch hadoop.conf
chattr +i hadoop.conf
以上命令执行完成之后,无论是删除还是修改,或者追加的操作都不允许。
#bash
touch hadoopRun.log
chattr +a hadoopRun.log
以上命令执行完成之后,除了追加的操作之外,都不允许进行操作
echo “123” >> hadoopRun.log
选项 | 解释 |
---|---|
-R | 递归显示目录下所有子目录和文件的属性 |
-a | 显示所有文件的属性信息,包括以 . 开头的文件 |
-d | 显示目录的属性,而不是目录下的文件的属性 |
通常来说,普通账户不具备的权限太多,在工作时非常的不方便,但又不能让太多程序员知道root账号的密码,所以有了普通用户的超级权限——sudo
为什么要挂载,因为文件系统不能够被用户直接使用。需要有一个特定的入口,Windows中的入口被称为盘符,Linux系统中的入口被称为目录
将文件系统和目录(盘符)结合的动作,叫做挂载。
挂载的意义就是为读取文件系统中的内容。
语法:mount [文件系统] [目录]
案例:
#bash
#注意,cd-rom这个目录时手动创建的,不一定要这个名字
mount /dev/cdrom /cd-rom
七层结构记忆方法:应、表、会、传、网、数、物
OSI七层网络模型 | TCP/IP四层概念模型 | 对应网络协议 |
---|---|---|
应用层(Application) | 应用层 | HTTP、TFTP、FTP、NFS、WAIS |
表示层(Presentation) | 应用层 | Telnet、Rlogin、SNMP、Gopher |
会话层(Session) | 应用层 | SMTP、DNS |
传输层(Transport) | 传输层 | TCP、UDP |
网络层(Network) | 网络层 | IP、ICMP、ARP、RARP、AKP、UUCP |
数据链路层(Data Link) | 数据链路层 | FDDI、Ethernet、Arpanet、PDN、SLIP、PPP |
物理层(Physical) | 数据链路层 | IEEE 802.1A、IEEE 802.2 到 IEEE 802.11 |
交换机负责内容,路由器负责外网。
交换机的作用是为了取代HUB设备(HUB设备因为数据广播的特性,基本被淘汰了),为电脑组件了局域网。
负责代替PC拨号,接替PC与光猫的通信。负责将内网(局域网)的数据与公网上的服务器或其他PC进行数据的通信。
a类:10.x.x.x
b类:172.16.x.x - 172.31.x.x
c类:192.168.x.x
ip地址的作用,就是为了让PC或其他设备在网络中有一个通信地址。
IP地址中分为网络位和主机位。(想要搞清楚一个IP地址中的网络位和主机位,就必须要结合子网掩码来验证)
一个网络的关口,内网中数据想要发送到公众网络中去,就必须经过这个网络关口,由于历史中担任网络关口的设别叫做路由器,所以现在基本上提到网关,就是指路由器。
dns服务器的作用就是为了帮助所有的电脑主动解析域名的IP地址。
连接方式 | 解释 | 优点 | 缺点 |
---|---|---|---|
VMnet8 | 网络地址转换模式,可以使虚拟机不必参照宿主主机的网络环境。因为虚拟机的网络地址是由VMNet8网卡提供的。 | 不依靠宿主主机网络,在任何地方都可以提供一个稳定可靠的ip地址 | 除宿主主机外的其他主机想要访问虚拟机的比较麻烦。 |
桥接模式 | 在此环境下,因为虚拟机使用的是和宿主主机相同的网络环境,每当宿主主机变更了网络环境时,那么,虚拟机也必然需要换IP地址。 | 与宿主主机相同网络的任意主机,只要拥有账户和密码,都能直接访问到它。 | 虚拟机的网络完全依靠宿主主机,宿主主机没有网络时,虚拟主机也没有网络。 |
从本地拷贝数据到远程的服务器:
语法:scp [-r] {path}/file | dir {UserName}@Host_ip:/{path}
案例:
拷贝文件到远程的服务器
命令:
# bash
scp file1 root@cloud:/home
# cloud是主机名,在本机的hosts文件中已配置好地址
拷贝目录到远程的服务器。
命令:
# bash
scp -r /root/ root@cloud:/home
示例图:
登录命令:
ssh {UserName}@Host_IP
示例:ssh [email protected]
在公司里面,绝大部分都在使用Linux操作系统。
在生成的时候,会产生两个证书 - 密钥对。
密钥对 | 暗号 | rsa | 作用 |
---|---|---|---|
公钥 | 天王盖地虎 | id_rsa.pub | 负责加密内容 |
密钥 | 上山打老虎 | id_rsa | 负责解密内容 |
文件 | 解释 |
---|---|
known_hosts | 用来记录本机曾访问过的主机地址。 |
authorized_keys | 文件内容记录了来访服务器的公钥证书文件内容 |
生成证书的命令:
ssh-keygen
第一次回车,进入证书生成程序。
第二次回车,确认证书的存放位置
第三次回车,要求对私钥证书文件设置密码(若不输入则为空密码)
第四次回车,确认密码。
注:证书生成之后,配对的公、私钥是唯一的,如果其中一个丢失,不可能在找回。
语法:ssh-copy-id {UserName} @Host_IP
解释:注册的过程是将本机中的公钥证书文件内容发送到远程服务器,远程的服务器接收证书内容后,会将内容记录在authorized_keys文件中,此后任意一台具有配对生成时的私钥证书文件者,都可以免密登录该服务器。
加密证书的方式,通常时为了用证书通过xshell类型的工具管理服务器。
不加密证书的方式,通常是为了集群之间进行免密登录的。
Linux系统自带的一个下载工具。功能较强 – 具备端点下载,也支持批量下载,后台下载,限速下载等功能。
概念:进程是程序执行过程,也是具体的实现。
在Windows中可以通过任务管理器来结束某一个进程。
当操作系统开始启动时就已经产生了进程。
不同的操作系统的进程也会有差异。
如Linux,启动的第一个进程就是init。
当系统启动完毕之后,在系统中任意操作都会启动一个进程。只不过有些进程在执行完成后立即结束。
进程分为两种:
进程类型 | 解释 |
---|---|
临时进程 | 部分程序执行之后立即结束,如ls |
持久进程 | vi编辑器,此类程序,需要认为的关闭才会停止。 |
在Linux系统中,并没有像Windows系统中的任务管理器那么方便。所以需要在Linux系统查询进程时,需要学习一下的命令。
选项 | 解释 |
---|---|
aux | 当前系统所有的进程(非常常用) |
ef | 把进程之间的关系显示出来 |
axjf | 显示全部进程以及他们间的关系 |
ps aux
,结果如图进程相关的名词解释:
选项 | 含义 |
---|---|
USER | 该process属于哪个使用者 |
PID | 该process的程序标识符(进程ID) |
%CPU | 该process使用掉的CPU资源百分比 |
%MEM | 该process所占用的物理内存百分比 |
VSZ | 该process使用掉的虚拟内存量(Kbytes) |
RSS | 该process占用的物理的内存量(Kbytes) |
TTY | 该process时在哪个终端机上面运作,若与终端机无关则显示 ?,另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连接进主机的程序。(pts表示虚拟终端,例如pts/1 pts/2等) |
STAT | 该进程目前的状态,状态显示与 ps -l 的 S 旗标相同(R/S/D/T/Z)(详细见下表) |
START | 该process被触发启动的时间 |
TIME | 该process实际使用CPU运作的时间 |
COMMAND | 该程序的实际命令是什么或理解为该进程是哪一个程序/命令启动的 |
状态 | 解释 |
---|---|
D | 不可中断 Uninterruptible (usually IO) |
R | 正在运行,或在队列中的进程 |
S | 处于休眠状态 |
T | 停止或被追踪 |
Z | 僵尸进程 |
W | 进入内存交换 (从内核2.6开始无效) |
X | 死掉的进程 |
l | 多进程 |
< | 高优先级 |
N | 低优先级 |
s | 包含子进程 |
+ | 位于后台的进程组 |
选项 | 含义 |
---|---|
Uup | UTF8(推荐使用) |
Aup | ASCII |
选项 | 含义 |
---|---|
-d 数字 | 表示每多少秒更新一次画面 |
-b | 表示已批次的方式运行 |
-n 数字 | 通常结合-b来一起使用,将画面按照n次的方式输出 |
-p pid | 可以使top按照某一个pid来持续进行观察 |
按键指令 | 含义 |
---|---|
? | 显示在top当中可以输入的按键指令 |
P | 以CPU的使用资源排序显示 |
M | 以Memory的使用资源排序显示 |
N | 以PID来排序 |
T | 由该Process使用的CPU时间累计(TIME+)排序 |
k | 给予某个PID后kill该进程(内核2.6后失效) |
q | 离开top软件的按键 |
信号量 | 含义 |
---|---|
1 | 终止进程,如果是守护进程,则重新读取进程的参数配置 |
2 | 类似于键盘Ctrl+C的组合键 |
9 | 强制结束某个进程。 |
15(缺省值) | 以正常方式关闭进程。 |
信号量 | 含义 |
---|---|
1 | 终止进程,如果是守护进程,则重新读取进程的参数配置 |
2 | 类似于键盘Ctrl+C的组合键 |
9 | 强制结束某个进程。 |
15(缺省值) | 以正常方式关闭进程。 |
sshd是一个守护进程,默认使用过的端口号是22,可以通过修改 /etc/ssh/sshd_config
配置文件来达到端口的修改。
修改过端口之后,需要重启一次sshd服务,重启命令 ,否则新端口不生效。
free:观察内存(memory)使用情况
uname:查阅系统与核心相关信息
uptime:观察系统启动时间与工作负载
语法:nestat [选项 ]
选项:
选项 | 含义 |
---|---|
-a | 将目前系统上的所有的已经连接、监听、Socket数据都列出来 |
-t | 列出tcp网络包的信息 |
-u | 列出udp网络包的信息 |
-n | 以端口(port number)方式来显示(不以程序的服务名称) |
-l | 列出目前正在监听(listen)的服务 |
-p | 列出该网络服务的进程id(PID) |
常用组合:lntp、antp、lnt、aunp
vi。
jobs -r
jobs -s
jobs
jobs -l
vim是vi文本编辑器的高级版。
具备更多的功能,例如:给内容加上颜色,便于区分,加强编程能力。
三种模式:
快捷键 | 功能 |
---|---|
i | 从光标所在处插入(***) |
I | 从所在行第一个非空白字符处插入(**) |
a | 从光标所在下一个字符处插入 |
A | 从光标所在行最后一个字符处插入(**) |
o | 在光标所在处下一行插入新的一行(**) |
O | 在光标所在处上一行插入新的一行(**) |
快捷键 | 功能 |
---|---|
r | 替换光标所在处字符一次 |
R | 一直替换光标所在处文字直到按下Esc(***) |
命令 | 功能 |
---|---|
:w [filename] | 另存为filename |
:r [filename] | 读取filename指定文件中的内容到光标所在的行 |
:n1,n2 w [filename] | 将n1到n2行另存为filename |
:! command | 临时切换到命令行模式下执行command命令 |
:wq | 保存后离开 |
:q | 不保存离开(未改可以离开,如果修改了需要 q! 强制离开) |
:q! | 不保存离开 |
:set nu | 显示行号 |
:set nonu | 取消显示行号 |
: s/word1/word2/g | 在当前行将word1替换成word2(**) |
:%s/word1/word2/g | 在当前文件将word1替换成word2(**) |
:n1,n2s/word1/word2/g | 在n1到n2行查找word1替换成word2(n1、n2为数字) |
:1.$ s/word1/word2/g | 从第一行到最后一行查找word1替换成word2 |
:%s/word1/word2/go | 同上,在替换前确认是否替换。(***) 只能单行确认,需要逐行确认。 |
:%s/word1/word2/go
的示例:
替换为 b (y / n / a / q / l / ^E / ^Y)
y表示yes,n表示no,a表示all(限光标当前到最后一行),q表示quit,l表示替换后移动光标到行首,^E (Ctrl+E) 表示向下翻,^y (Ctrl+Y) 表示向上翻。
指通过某些算法,将文件尺寸进行相应的缩小,同时不损失文件的内容。
指将多个文件(或目录)合并成一个文件,方便传递或部署。
在Linux系统中,文件的后缀名不重要,但是针对于压缩文件的后缀名是必须的,因为可以让其他的程序员根据文件的后缀名使用对应的算法进行解压。
后缀 | 含义 |
---|---|
*.gz | gzip程序压缩的文件 |
*.bz2 | bzip2程序压缩的文件 |
*.Z | compress(旧的加密算法,目前基本不用)程序压缩的文件 |
*.tar | tar命令打包的数据,并没有压缩过 |
*.tar.gz | tar程序打包的文件,并且经过gzip的压缩 |
*.tar.bz2 | tar程序打包的文件,并且经过bzip2的压缩 |
总结:
gzip拥有更快的压缩性能。
bzip2拥有更高的压缩比。
单纯从压缩比方面来说,那么bzip2 > gzip > compress
选项 | 含义 |
---|---|
-c | 建立打包文件 |
-t | 查看打包文件的内容含有哪些文件 |
-x | 解打包或解压缩的功能,可以搭配-C(大写)在指定目录解开 |
-j | 通过bzip2的支持进行压缩/解压缩:此时文件最好为*.tar.bz2 |
-z | 通过gzip的支持进行压缩/解压缩:此时文件最好为*.tar.gz |
-v | 在压缩/解压缩的过程中,将正在处理的文件名显示出来 |
-f filename: | -f 后面跟处理后文件的全名称(路径+文件名+后缀名) |
-C 目录: | 这个选项在解压的时候,若要在特定目录解压,可以使用这个选项 |
注:使用命令进行打包、压缩的时候,使用了什么算法,文件后缀名就一定要与其对应。
rpm最早是由Redhat Package Manager,由于该机制非常好用,被很多的发行版本当作自己的软件管理。
路径 | 说明 |
---|---|
/etc | 一些配置文件放置的目录,例如/etc/crontab |
/usr/bin | 一些可执行文件 |
/usr/lib | 一些程序使用的动态链接库 |
/usr/share/doc | 一些基本的软件使用手册与说明文件 |
/usr/share/man | 一些man page(Linux命令的随机帮助说明)文件 |
yum的由来,是因为rpm的缺点所导致,因为rpm无论安装还是卸载都需要解决依赖关系,并且比较繁琐,所以诞生yum的技术
yum通过分析rpm的信息来进行软件的安装、升级、卸载。
所有的yum源都存放在/etc/yum.repos.d/目录下
工作环境中,一般都会屏蔽系统自带的yum源,二选择权威机构的yum源
命令 | 说明 |
---|---|
search | 查询某个软件名称或者是描述的关键字 |
list | 列出目前yum所管理的所有的软件名称与版本,有点类似 rpm -qa |
info | 同上,格式不太一样,不过有点类似 rpm -qai 的执行结果 |
7.2 yum的安装、卸载、更新
命令 | 说明 |
---|---|
yum install package_Name | 安装 |
yum remove package_Name | 卸载 |
yum update package_Name | 更新 |
注:yum update 需要注意是会进行全系统更新
yum安装、卸载、更新的过程中出现的y/N,可以通过在命令的结尾处 -y,表示全程执行yes操作。
操作 | 命令 |
---|---|
开启 | service ip tables start / etc/init.d/iptables.start |
关闭 | service ip tables stop / etc/init.d/iptables.stop |
重启 | service ip tables restart / etc/init.d/iptables.restart |
查看 | service ip tables status / etc/init.d/iptables.status |
注:需要重启服务器才能生效(内核级的操作需要重启)
操作 | 命令 |
---|---|
开启 | chkconfig iptables on |
关闭 | chkconfig iptables off |
不重启服务器永久关闭防火墙:
# bash
service iptables stop
chkconfig iptables off
简单的说就是用户和内核之间进行通信/沟通的翻译官
系统提供多种shell程序:
所以课上学习的和现在工作中所经常使用的shell程序是:/bin/bash
变量的概念源于数学,在计算机中能存储计算结果,或表示值。
在shell语言中,不想java语言可以定义变量的类型。
echo $variable
读取变量,有两种方式:
系统的环境变量文件:
/etc/profile
编辑完成此文件后,需要让文件生效,命令为:
source /etc/profile
JAVA_HOME=[path]
如何将上面的变量设置为系统环境变量:
通过export关键字,可以有效的将普通变量设置为环境变量。
环境变量的两种设置形式:
# bash
export JAVA_HOME=[path]
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
# bash
JAVA_HOME=[path]
PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
export $JAVA_HOME $PATH
变量与变量值需要用一个 “=” 连接。
“=”两边不允许使用空格,因为Linux系统特性,命令与选项、参数之间以空格隔开。如果设置变量时“=”两边使用了空格,那么变量名会被当作是命令来执行。
变量名只能是英文字母、数字、下划线、但开头不能是数字。
如果变量值中有空格,需要使用引号来包起来。
单引号中的内容会被当作普通字符串(java的String) 来处理。
案例:
# bash
x=’$LANG’
echo $x
# $LANG
双引号中的内容会按照其原本的属性进行输出
案例:
# bash
x="$LANG"
echo $x
# zh_CN.UTF-8
可以用转义字符 “\” 将特殊符号(如:$、\、!等)变为一般字符
version=$(uname)
version= v e r s i o n − {version}- version−(uname -p)
注:${version},加上大括号,为了保护变量的内容不受其他字符串的影响
案例:
使用主机名和时间当作文件名称来打包(要求自动实现日期自动增长)
# bash
tarName= h o s t n a m e − {hostname}- hostname−(date +%F)
tar -zcvf $(tarName)_etc.gar.gz /etc # 此处的变量使用大括号抱起来 原因是因为-, 如果不使用大括号,那么变量的值会受到外界的字符影响,导致丢失。
例如:
tar -zcvf $tarName_etc.tar.gz /etc
结果会得到一个隐藏的tar.gz文件。
变量的小总结:
把一个命令定义成一个变量 $(命令) 或 `命令`
数据重定向就是将某个命令执行后应该要出现在屏幕上的数据,给他传输到其他的地方,例如传输到文件或是其他命令。
输出类型 | 编号 | 操作 |
---|---|---|
标准输入(stdin) | 0 | 使用<或<< |
标准输出(stdout) | 1 | 使用>或>> |
标准错误输出(stderr) | 2 | 使用>或>> |
查看命令执行结果:echo $?
1>:以覆盖的方法,将正确的数据输出到文件
1>>:以累加的方法,将正确的数据输出到文件
2>:以覆盖的方法,将错误输出的数据输出到文件
2>>:以累加的方法,将错误输出的数据输出到文件
案例:
命令回传值$?有两种:与&& 或||
举例:
将前面的命令执行结果导入到后面命令当作输入。也就是管道符左边命令的结果是右边命令的输入。
案例:
netstat -lntp | grep 22
由于Linux系统大部分都是应用与服务器上,所以查询数据的时候并没有图形化界面查找数据的便捷性。
语法:
find [path] [选项] 参数
选项:
选项 | 说明 |
---|---|
-name | 按文件名查询 |
-perm | 按文件权限查询 |
-size | 按文件的大小查找 |
-user | 按用户(属主)查询 |
-group | 按用户组查询 |
-nogroup | 查没有用户组的 |
-mtime | 按文件的修改时间来查询 |
-type | 按文件的类型查询 b - 块设备文件。 d - 目录 c - 字符设备文件。 n - 管道文件 l - 符号链接文件。 f - 普通文件 |
案例:
查找jdk安装目录。
# bash
find / -name java
查找当前系统中所有的.java后缀名的文件
# bash
find / -name “*.java”
查找系统中/home目录下的非普通文件
# bash
find /home ! -type f
非交互式文本处理工具,通常情况下解决脚本(解决机械性能和复杂功能)中不能使用VIM的操作。
sed本身是一个逐行处理工具,默认情况下会逐行处理到文件的结束。默认情况下不修改源文件,因为sed是将源文件内容逐行copy到一个临时缓冲区(模拟空间),对其进行编辑,行处理结束后,将其输出到屏幕上,也可以通过数据重定向将结果导入到新的文件中去。
sed本身提供修改源文件的选项。但是如果修改源文件时,结果内容不会发送到屏幕上。
语法:
sed [选项] “[操作]” [fileName]
选项:
选项 | 说明 |
---|---|
e | 允许对输入数据应用多条sed命令进行编辑 |
i | 表示直接操作源文件 |
操作:
操作 | 说明 |
---|---|
s: | 字符串匹配/查找 |
i: | 插入 |
a: | 追加 |
d: | 删除 |
c: | 替换 |
p: | 打印指定的输出行 # 可以不要 |
**!注意:**选项和动作的字母i不是同样的功能
案例:
源文件内容:
hello teduhadoop
hello hadoop
hello hdfs, hi sed
1.修改全文的第一个h和第二个h 为大写
# bash
sed “s/h/H/1;s/h/H/1” demo
2.修改全文的所有h和第一个l 为大写
# bash
sed -e “s/h/H/g” -e “s/l/L/1” demo
or
sed -e “s/h/H/g;s/l/L1” demo
课件案例:
知识扩展:
如何快速清除文件内容
# bash
> [fileName]
这是一款强大文本搜索工具,它支持正则表达式
选项:
选项 | 说明 |
---|---|
-number | 同时显示匹配行上下的n行 |
-b, --byte-offset | 打印匹配行前面打印该行所在的块号码 |
-c, --count | 只打印匹配的行数,不显示匹配的内容 |
-f File, --file=File | 从文件中提取模板,空文件中包含0个模板,所以什么都不匹配 |
-h, --no-filename | 当搜索多个文件时,不显示匹配文件名前缀 |
-i, --ignore-case | 忽略大小写差别 |
-q, --quiet | 取消显示,只返回退出状态。0则表示找到了匹配的行 |
–color | 将匹配内容上色区分 |
-n, --line-number | 在匹配的行前面打印行号 |
-v, --revert-match | 反检索,只显示不匹配的行 |
文本监控,通常情况下用于监视文件的增长
场景:
大数据环境中,很多软件在启动时,不会将真正的启动/过程日志打印在屏幕上,因为内容繁多,会影响程序员观察启动过程中,哪个进程没有启动。像此种场景,我们就可以利用tail工具用来监视该软件启动日志文件的实际内容。
语法:
tail [选项] fileName (默认显示最后10行)
选项:
选项 | 说明 |
---|---|
-F | 用于监控文件的增长 |
-n | 从指定的行出进行监控文件的内容 |
案例:
不显示最前面的5行
tail -n +5 filename
sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,一次按ASCII码值进行比较。
选项:
选项 | 说明 |
---|---|
-u | 不出现重复的行 |
-t | 指定分段的符号 |
-k | 指定的第几个段进行排序 |
-r | 逆向配许(反向排序) |
注意:
sort会受系统的环境变量的影响,Linux系统中很多软件都会在部署自己的环境时修改系统的环境变量,此时会导致sort的配许不会按照ASCII码进行,解决方法就是执行下面的两条命令:
# bash
LC_ALL=C
export LC_ALL
但是,此命令之后会影响vim中编码集,恢复编码集的命令为:
# bash
LC_ALL
export LC_ALL
执行完即可,两次命令执行后会恢复sort的排序方式,并且vim的编码集也会恢复
cut命令在文件中负责剪切数据用的
选项:
选项 | 说明 |
---|---|
-b | 字节 |
-c | 字符 |
-f | 提取第几列 |
-d | 按指定分隔符分割列 |
案例:
源文件内容:
192.168.1.1
192.168.1.3
192.168.1.5
192.168.1.4
截取第11个字节:
# bash
cut -b 11 demo
截取第7-9的字节
# bash
cut -b 7-9 demo
截取最后一个字节进行排序
# bash
cut -b 11 demo | sort
or
sort demo | cut -b 11
以点为 分隔符 获取第二个字段
# bash
cut -d ‘.’ -f 2 demo
拓展:
获取字符串最后一位
# bash
grep -o .$
history
该命令可以用来查看Linux系统中曾经执行过的命令(默认1000条)
用法:
命令 | 用法 |
---|---|
!! | 运行上一条命令 |
!88 | 运行第88条命令 |
!88 /test | 运行第88条命令并在命令后面加上/test |
!ls | 运行上一个ls命令 |
!ls:s/CF/l | 运行上一个ls命令,其中把CF替换成l |
fc | 编辑并运行上一个历史命令 |
fc 66 | 编辑并运行第66个历史命令 |
histroy -c | 表示清除历史命令 # 学习阶段不要使用此命令,会清空历史命令 |
概念:
shell脚本如何执行:
脚本中的内容:
数值的运算格式
使用范例:test [选项] fileName
选项:
文件类型判断 | |
---|---|
选 项 | 作 用 |
-b filename | 判断文件是否存在,并且是否为块设备文件。 |
-c filename | 判断文件是否存在,并且是否为字符设备文件。 |
-d filename | 判断文件是否存在,并且是否为目录文件。 |
-e filename | 判断文件是否存在。 |
-f filename | 判断文件是否存在,井且是否为普通文件。 |
-L filename | 判断文件是否存在,并且是否为符号链接文件。 |
-p filename | 判断文件是否存在,并且是否为管道文件。 |
-s filename | 判断文件是否存在,并且是否为非空。 |
-S filename | 判断该文件是否存在,并且是否为套接字文件。 |
文件权限判断 | |
---|---|
选 项 | 作 用 |
-r filename | 判断文件是否存在,并且是否拥有读权限。 |
-w filename | 判断文件是否存在,并且是否拥有写权限。 |
-x filename | 判断文件是否存在,并且是否拥有执行权限。 |
-u filename | 判断文件是否存在,并且是否拥有 SUID 权限。 |
-g filename | 判断文件是否存在,并且是否拥有 SGID 权限。 |
-k filename | 判断该文件是否存在,并且是否拥有 SBIT 权限。 |
-z string | 判断字符串是否为空?若string为空字符串,则为true |
-n string | 判断字符串是否为空?若string为空字符串,则为false |
str1 = str2 或 == | 判断str1是否等于str2,若相等,则返回true |
str1 != str2 | 判断str1是否不等于str2,若相等,则返回false |
文件比较 | |
---|---|
选 项 | 作 用 |
filename1 -nt filename2 | 判断 filename1 的修改时间是否比 filename2 的新。 |
filename -ot filename2 | 判断 filename1 的修改时间是否比 filename2 的旧。 |
filename1 -ef filename2 | 判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
[] 用于判断,类似与test的功能
案例:
判断用户输入的是y还是n,为y返回yes,为n返回no
什么是脚本的参数?
比如,ls -al install.log 其中-al就是这个ls的shell脚本参数,那么我们自己写的脚本参数该如何使用呢。
/path/to/scriptname arg1 arg2 arg3 arg4
$0 $1 $2 $3 $4
参数 | 说明 |
---|---|
$0 | 代表脚本程序本身 |
$1,$2,… | 代表后面第一个参数,第二个参数,等等 |
$# | 代表后接的参数个数,以上边为例,这里显示为4 |
$@ | 代表"$1" “$2” “$3” “$4”,每个变量是独立的(用双括号括起来) |
$* | 代表"$1 $2 $3 $4" |
单分支结构:
if [ 条件 ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
多分支结构:
if [ 条件 ];then
符合该条件执行的语句
elif [ 条件 ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
条件 | 说明 |
---|---|
-b FILE | 如果 FILE 存在且是一个块特殊文件则为真。 |
-c FILE | 如果 FILE 存在且是一个字特殊文件则为真。 |
-d DIR | 如果 FILE 存在且是一个目录则为真。 |
-e FILE | 如果 FILE 存在则为真。 |
-f FILE | 如果 FILE 存在且是一个普通文件则为真。 |
-g FILE | 如果 FILE 存在且已经设置了SGID则为真。 |
-k FILE | 如果 FILE 存在且已经设置了粘制位则为真。 |
-p FILE | 如果 FILE 存在且是一个名字管道(F如果O)则为真。 |
-r FILE | 如果 FILE 存在且是可读的则为真。 |
-s FILE | 如果 FILE 存在且大小不为0则为真。 |
-t FD | 如果文件描述符 FD 打开且指向一个终端则为真。 |
-u FILE | 如果 FILE 存在且设置了SUID (set user ID)则为真。 |
-w FILE | 如果 FILE存在且是可写的则为真。 |
-x FILE | 如果 FILE 存在且是可执行的则为真。 |
-O FILE | 如果 FILE 存在且属有效用户ID则为真。 |
-G FILE | 如果 FILE 存在且属有效用户组则为真。 |
-L FILE | 如果 FILE 存在且是一个符号连接则为真。 |
-N FILE | 如果 FILE 存在 and has been mod如果ied since it was last read则为真。 |
-S FILE | 如果 FILE 存在且是一个套接字则为真。 |
FILE1 -nt FILE2 | 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。 |
FILE1 -ot FILE2 | 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。 |
FILE1 -ef FILE2 | 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。 |
条件 | 说明 |
---|---|
-z 字符串 | 如果字符串的长度为零则为真 ,即判断是否为空,空即是真; |
-n 字符串 | 如果字符串的长度非零则为真 ,即判断是否为非空,非空即是真; |
字符串1 = 字符串2 | 如果两个字符串相同则为真 ; |
字符串1 != 字符串2 | 如果字符串不相同则为真 ; |
字符串1 | 如果字符串不为空则为真,与-n类似 |
条件 | 说明 |
---|---|
INT1 -eq INT2 | INT1和INT2两数相等为真 ,= |
INT1 -ne INT2 | INT1和INT2两数不等为真 ,<> |
INT1 -gt INT2 | INT1大于INT1为真 ,> |
INT1 -ge INT2 | INT1大于等于INT2为真,>= |
INT1 -lt INT2 | INT1小于INT2为真 ,< |
INT1 -le INT2 | INT1小于等于INT2为真,<= |
逻辑符 | 说明 |
---|---|
-a | 与 |
-o | 或 |
! | 非 |
注意:if利用read传参判断
#!/bin/bash
#echo -n "请输入你的分数:"
#read score
#echo "input score is $ score "
read -p 请输入你的分数:" score
echo -e "你输入的成绩为: [$score], 正在查询中……"
if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];then
echo "对不起,你的成绩不合格!"
elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];then
echo "你的成绩评定为良好"
elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];then
echo "你的成绩评定为优秀"
else
echo "输入有误,请输入0-100以内的整数!"
fi
function name() {
命令xxx
}
或者
(function) name() {
命令xxx
}
两种语法格式,推荐使用第一种
函数的使用方式就是在sh脚本中,重新调用一次自定义的“函数名”
例如:
function print() {
echo "Hello world"
}
*********
print # 此处执行时一次print就会打印一次"Hello world"
语法:sh [-nvx] scripts.sh
选项与参数:
选项 | 说明 |
---|---|
-n | 不执行script,仅查询语法的问题!! |
-v | 在执行script前,先将scripts的内容输出到屏幕上 |
-x | 将使用到的script内容显示到屏幕上,这是很有用的参数!!! |
语法:for…do…done循环
for 变量名 in 变量取值列表
do
命令
done
提示:在次结构中,”in 变量取值列表“可省略,省略时相当于使用for i in ”$@“
案例
#!/bin/bash
for ip in `cat host.txt`
do
scp ${path}/software.tar.gz UserName@${ip}:/${path}/
done
语法:
while [ condition ]; do
命令xxx
done
或者:
while [ condition ]
do
命令
done
案例
#!/bin/bash
while true
do
uptime
sleep 1
done
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ] # while 和 [ 之间要加一个空格 true则执行
do
sum=$(($sum + $i))
i=$(($i + 1)) #运算结果为变量赋值可以使用$((...))
done
echo "the result of '1+2+3+...+100' is $sum"
有兴趣的伙伴请在下方评论区留言。