目录
Maven
1.为什么要使用Maven?
(1)传统的以来jar包,我们需要在网上进行下载,然后复制粘贴然后进行使用。但是有了Maven的使用,可以在相应的pom.xml文件之中,填写自己想要的jar包依赖,它就是可以进行自动下载添加。
(2)你只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同时下载这个jar包所依赖的其他jar包——规范、完整、准确!
(3) 传统的jar包进行引入的时候,需要进行注意的是jar包之间的依赖关系,导入一个依赖还需要导入依赖所需的依赖,但是Maven的使用,使得这个导入依赖的过程变得简单。使用pom.xml文件配置好之后,自动导入依赖所需的依赖,无需人工参与。
(4)依赖冲突问题,如下图所示
Maven遵循两个原则:最短路径者优先和先声明者优先,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。
(5)多个工程同时进行的时候,可以得到上层依赖于下层的关系。
(6)项目分布式部署
2.Maven是什么?
(1)首先,我们要了解一个构建的概念。
针对于纯java代码:.java扩展名的源文件需要编译成.class扩展名的字节码文件才能够执行,这个过程称之为编译。
针对于Web而言:我们需要将相应的代码搁置到对应的目录下执行,这个搁置的过程称之为部署。
构建就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、JSP页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
(2) 构建环节
如下所示的构建环节是比较好理解的。
a.测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
b.报告:在每一次测试后以标准的格式记录和展示测试结果。
c.安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
d.部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
3.Maven如何使用?
(1)配置环境变量
a.Maven是java开发的,因此是需要知道相应的java的JDK是否存在。进入cmd环境下,检测相应的JDK的安装目录。
C:\Windows\System32>echo %JAVA_HOME%
D:\Java\jdk1.8.0_111
b.解压Maven的jar包,解压到相应的一个非中文目录下方,记录路径。
D:\apache-maven-3.2.2
c.配置环境变量
在系统变量里进行配置
变量:M2_HOME
值:D:\apache-maven-3.2.2
在Path之中进行配置
变量:Path
值:%M2_HOME%\bin或D:\apache-maven-3.2.2\bin
d.检查是否安装成功
在相应的cmd环境下,输入如下
C:\Users\Administrator>mvn -v
(2)Maven的本地配置
我的理解就是国内是一般不能使用这个东西的,一般是需要墙一下,因此这个地方是需要相应的镜像过程,国内才是可以使用的。
a.Maven默认的本地仓库:~\.m2\repository目录。~表示当前用户的家目录。
b.Maven的核心配置文件位置:
解压目录D:\apache-maven-3.2.2\conf\settings.xml
c.本地仓库地址更改到E:\LocalRepository,默认在C:\Users\Administrator\.m2\repository
<localRepository>E:\LocalRepository</localRepository>
d.配置阿里云镜像(下载速度快)
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
(3)在Idea中配置Maven
a.设置安装目录
解释:
Maven home directory:可以指定本地 Maven 的安装目录所在,配置了系统变量,因此是可以指定的。
User settings file / Local repository:我们还可以指定 Maven 的 settings.xml 位置和本地仓库位置。
b.配置Maven自动导入依赖的jar包
- Import Maven projects automatically:表示 IDEA 会实时监控项目的 pom.xml 文件,进行项目变动设置,勾选上。
- Automatically download:在 Maven 导入依赖包的时候是否自动下载源码和文档。默认是没有勾选的,也不建议勾选,原因是这样可以加快项目从外网导入依赖包的速度,如果我们需要源码和文档的时候我们到时候再针对某个依赖包进行联网下载即可。IDEA 支持直接从公网下载源码和文档的。
- VM options for importer:可以设置导入的VM参数。一般这个都不需要主动改,除非项目真的导入太慢了我们再增大此参数。
(4) Maven程序测试
a.project创建,需要注意的是project创建过程之中出现的相应的名称和路径
b.创建module:右键→new Module→Maven
注意下面是一个规范,写东西要规范一些。否则的话,后面用起来容易出现问题。
c.目录说明
- main目录用于存放主程序。
- java目录用于存放源代码文件。
- resources目录用于存放配置文件和资源文件。
- test目录用于存放测试程序。
d.一些什么清理测试什么的,前面已经说明,不过就是在进行测试的时候,在相应的package文件之中产生相应的文件,查看这些文件是如何进行使用即可。
4.Maven核心概念
Maven的核心概念包括:POM、约定的目录结构、坐标、依赖、仓库、生命周期、插件和目标、继承、聚合。
(1)pom:就是进行相应的pom.xml文件的配置。
(2)约定的目录结构:上面已经进行了相应的说明。
(3)坐标:坐标的使用就是将Maven仓库之中确定的jar进行提取的过程。
groupId:公司或组织的域名倒序+当前项目名称
artifactId:当前项目的模块名称
version:当前模块的版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
如何通过坐标到仓库中查找jar包?
如上面所示,写的相应的pom.xml文件可以知道,首先是将上面的三个东西进行一个串联,即com.atguigu.maven + Hello + 1.0-SNAPSHOT,然后就是在相应的仓库目录下进行查找:com/atguigu/maven/Hello/1.0-SNAPSHOT/Hello-1.0-SNAPSHOT.jar。
注意:我们自己的Maven工程必须执行安装操作才会进入仓库。安装的命令是:mvn install
依赖测试,在相应的main/java之中进行主函数的填写,在test/java中进行测试填写。
(4)依赖管理
a.依赖的传递性
Maven工程 | 依赖范围 | 对A的可见性 | ||
A | B | C | compile | √ |
D | test | × | ||
E | provided | × |
b.依赖范围
c.依赖原则
1)路径最短者优先
2)路径相同时先声明者优先
d.依赖排除
下面的这个例子就是进行了排除,首先是排除了原始的commons-logging,又使用了新的版本的commons-logging。
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>OurFriends</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖排除-->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
e.统一管理目标Jar包的版本
在使用的过程之中,可能是需要进行相应的版本的确定。有的时候是需要修改很多的,但是为了避免一个一个的修改,这里我们使用一个整体的修改方式。如下所示,是很好进行相应的理解的。
控制模块
<!--统一管理当前模块的jar包的版本-->
<properties>
<spring.version>4.0.0.RELEASE</spring.version>
</properties>
整体修改模块
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
(5)仓库
a.本地仓库
b.远程仓库
a)私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
b)中央仓库:架设在Internet上,为全世界所有Maven工程服务。
c)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
(6)生命周期
这个地方我的理解就是在运行的过程之中是存在相应的顺序的,关键的顺序是不能够省略的。
5.继承
(1)为什么要使用继承机制?
拿下面的这一段代码进行相应的举例子。
Hello | <dependency> |
HelloFriend | <dependency> |
MakeFriend | <dependency> |
进行依赖的时候,我们不用一个一个修改相应的junit的版本,只是需要修改父类的的junit的版本号就是可以进行相应的整体修改。
(2)创建父工程
注意其打包方式是pom
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
(3)子工程之中引用父工程
<!--继承-->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定从当前pom.xml文件出发寻找父工程的pom.xml文件的相对路径-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
(4)在父工程中管理依赖
将Parent项目中的dependencies标签,用dependencyManagement标签括起来
<!--依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
如果要是相应的子工程要用这些依赖的话,需要重新指定,否则就是在子工程之中是没有使用的。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
6.聚合
(1)为什么要使用聚合?
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。这时候就是需要用到相应的聚合过程了。
(2)如何配置聚合?
在总的聚合工程中使用modules/module标签组合,指定模块工程的相对路径即可。
<!--聚合-->
<modules>
<module>../MakeFriend</module>
<module>../OurFriends</module>
<module>../HelloFriend</module>
<module>../Hello</module>
</modules>
Maven可以根据各个模块的继承和依赖关系自动选择安装的顺序.
Linux
使用linux首先是要安装相应的VMWare和CentOS的,具体的安装过程见我的博客资源存档部分,已经上传。
1.Linux文件与目录
a.Linux之中一切皆文件。
b.Linux目录
/bin:是Binary的缩写,存放最常使用的命令。
/sbin:s是Super User的意思,用来存放管理员使用的系统管理程序。
/home:普通用户的主目录,一般是使用用户名进行定义的。
/root:超级管理员目录。
/lib:系统开机需要使用的动态库,就是相当于windows系统使用的DLL文档库。
/lost+found:非法关机时候存放的文档。
/etc:系统管理存放的系统所需要的配置文件和子目录。
/usr:用户的应用程序和文件都是存放到这个地方的。类似于windows之中program files目录。
/boot:存放linux启动时候核心文件,包括一些连接文件以及镜像文件。
/media:用来存放一些U盘和光驱,识别后Linux就是会将这些文件进行迁移到这个地方。CentOS7将这个部分进行了迁移到/run/media。
/mnt:用户临时挂载的别的文件。
/opt:给Linux用户额外摆放的安装软件目录。
/var:将经常修改的目录放到这个地方,当然也是有着各种日志文件的。
2.VI/VIM编辑器
(1)一般模式
当我们使用vim打开一个文件的时候,首先进入的就是一个一般模式。
语法 | 功能描述 |
yy | 复制光标当前一行 |
y数字y | 复制一段(从第几行到第几行) |
p | 箭头移动到目的行粘贴 |
u | 撤销上一步 |
dd | 删除光标当前行 |
d数字d | 删除光标(含)后多少行 |
x | 剪切一个字母,相当于del |
X | 剪切一个字母,相当于Backspace |
yw | 复制一个词 |
dw | 删除一个词 |
shift+6(^) | 移动到行头 |
shift+4 ($) | 移动到行尾 |
1+shift+g | 移动到页头,数字 |
shift+g | 移动到页尾 |
数字+shift+g | 移动到目标行 |
(2)编辑模式:这个地方存在什么五个按键,不用想那么多,直接使用i就是可以的。
(3)指令模式:按下【esc】
命令 | 功能 |
:w | 保存 |
:q | 退出 |
:! | 强制执行 |
/要查找的词 | n 查找下一个,N 往上查找 |
:noh | 取消高亮显示 |
:set nu | 显示行号 |
:set nonu | 关闭行号 |
:%s/old/new/g | 替换内容 /g 替换匹配到的所有内容 |
(4)转换过程
3.网络配置和系统管理操作
(1)查看IP和网关
这个步骤是在虚拟机之中进行的。
(2)配置网络ip地址
a.配置网络接口 进入Linux之中,输入ifconfig即可进行查看。
b.测试网络连通性,在Linux之中输入ping www.baidu.com
c.修改IP,vim /etc/sysconfig/network-scripts/ifcfg-ens33,需要进行修改的值如下所示:
执行service network restart 重启网络。
(3)配置主机名
a.查看当前服务器主机名称
[root@hadoop100 ]# hostname
b.如果感觉此主机名不合适,我们可以进行修改。通过编辑/etc/hostname文件
[root@hadoop100 ]# vim /etc/hostname
重启即可生效。
c.修改hosts映射文件
a)修改linux的主机映射文件(hosts文件),后续在hadoop阶段,虚拟机会比较多,配置时通常会采用主机名的方式配置,不用刻意记ip地址。
[root@hadoop100]# vim /etc/hosts
192.168.2.100 hadoop100
192.168.2.101 hadoop101
192.168.2.102 hadoop102
192.168.2.103 hadoop103
192.168.2.104 hadoop104
192.168.2.105 hadoop105
重启设备即可生效。
b)修改window的主机映射文件(hosts文件)
进入C:\Windows\System32\drivers\etc路径,添加如下内容。
192.168.2.100 hadoop100
192.168.2.101 hadoop101
192.168.2.102 hadoop102
192.168.2.103 hadoop103
192.168.2.104 hadoop104
192.168.2.105 hadoop105
(4)关闭防火墙(这里由于CentOS6已经过时了,这里讲解的主要是以CentOS7为主)
查看防火墙服务的状态
[root@hadoop100]# systemctl status firewalld
停止防火墙服务
[root@hadoop100]# systemctl stop firewalld
启动防火墙服务
[root@hadoop100]# systemctl start firewalld
重启防火墙服务
[root@hadoop100]# systemctl restart firewalld
(5)systemctl 设置后台服务的自启配置
开启/关闭iptables(防火墙)服务的自动启动
[root@hadoop100]# systemctl enable firewalld.service
[root@hadoop100]# systemctl disable firewalld.service
(6)关机重启命令
一般是迫不得已的时候,必需使用关机操作。正确的关机流程为:sync > shutdown > reboot > halt,才能够使得数据不能够丢失,保存相应的数据进行开机。
将数据由内存同步到硬盘中:#sync
重启:# reboot
关机:#halt
计算机将在1分钟后关机,并且会显示在登录用户的当前屏幕中:#shutdown -h 1 ‘This server will shutdown after 1 mins’
我一般很少想那么多,直接一个reboot重启。
4.常用基本命令
(1)帮助命令
在Linux之中使用的是man,在Xshell之中查看帮助使用的内置命令是help。
(2)文件目录类
a.pwd 显示当前工作目录的绝对路径
[root@hadoop101 ~]# pwd
/root
b.ls 列出目录的内容,每行列出的信息依次是: 文件类型与权限 链接数 文件属主 文件属组 文件大小用byte来表示 建立或最近修改的时间 名字
[atguigu@hadoop101 ~]$ ls -al
总用量 44
drwx------. 5 atguigu atguigu 4096 5月 27 15:15 .
drwxr-xr-x. 3 root root 4096 5月 27 14:03 ..
drwxrwxrwx. 2 root root 4096 5月 27 14:14 hello
-rwxrw-r--. 1 atguigu atguigu 34 5月 27 14:20 test.txt
c.cd 切换目录
参数 | 功能 |
cd 绝对路径 | 切换路径 |
cd相对路径 | 切换路径 |
cd ~或者cd | 回到自己的家目录 |
cd - | 回到上一次所在目录 |
cd .. | 回到当前目录的上一级目录 |
cd -P | 跳转到实际物理路径,而非快捷方式路径 |
d.mkdir 创建一个新的目录,这里的-p的使用是将
[root@hadoop101 ~]# mkdir -p xiyou/dssz/meihouwang
e.touch 创建空文件
[root@hadoop101 ~]# touch xiyou/dssz/sunwukong.txt
f.cp 复制文件或目录,注意复制一个目录的时候,前面是要进行添加-r的,进行递归复制过程。
[root@hadoop101 ~]# cp -r xiyou/dssz/ ./
g.rm 删除文件或者目录
选项 | 功能 |
-r | 递归删除目录中所有内容 |
-f | 强制执行删除操作,而不提示用于进行确认。 |
-v | 显示指令的详细执行过程 |
[root@hadoop101 ~]# rm -rf dssz/
h.mv 移动文件与目录或重命名
[root@hadoop101 ~]# mv xiyou/dssz/suwukong.txt xiyou/dssz/houge.txt
i.cat 查看文件内容,后面加入一个-n,是显示相应的行号。我一般是不使用这个命令的,我一般就是直接使用vim,vim多好用呀。
[atguigu@hadoop101 ~]$ cat -n houge.txt
j.more 文件内容分屏查看器,基本用不着
操作 | 功能说明 |
空白键 (space) | 代表向下翻一页; |
Enter | 代表向下翻『一行』; |
q | 代表立刻离开 more ,不再显示该文件内容。 |
Ctrl+F | 向下滚动一屏 |
Ctrl+B | 返回上一屏 |
= | 输出当前行的行号 |
:f | 输出文件名和当前行的行号 |
[root@hadoop101 ~]# more smartd.conf
k.less 分屏显示文件内容(与more类似),这个功能用于看小说可以。
操作 | 功能说明 |
空白键 | 向下翻动一页; |
[pagedown] | 向下翻动一页 |
[pageup] | 向上翻动一页; |
/字串 | 向下搜寻『字串』的功能;n:向下查找;N:向上查找; |
?字串 | 向上搜寻『字串』的功能;n:向上查找;N:向下查找; |
q | 离开 less 这个程序; |
[root@hadoop101 ~]# less smartd.conf
l. echo
-e: 支持反斜线控制的字符转换
控制字符 | 作用 |
\\ | 输出\本身 |
\n | 换行符 |
\t | 制表符,也就是Tab键 |
[atguigu@hadoop101 ~]$ echo “hello\tworld”
hello\tworld
[atguigu@hadoop101 ~]$ echo -e “hello\tworld”
hello world
m.head 显示文件头部内容,默认是前十行
[root@hadoop101 ~]# head -n 2 smartd.conf
n.tail 输出文件尾部内容,-f是实时最终文件的更新
选项 | 功能 |
-n<行数> | 输出文件尾部n行内容 |
-f | 显示文件最新追加的内容,监视文件变化 |
[root@hadoop101 ~]# date "+%Y-%m-%d %H:%M:%S"
2017-06-19 20:54:58
[root@hadoop101 ~]# tail -n 1 smartd.conf
o.history 查看已经执行过历史命令
[root@hadoop101 test1]# history
(3)时间日期类
a.date 显示当前时间
[root@hadoop101 ~]# date
2017年 06月 19日 星期一 20:53:30 CST
[root@hadoop101 ~]# date +%Y%m%d
20170619
b.date 显示非当前时间
显示前一天
[root@hadoop101 ~]# date -d '1 days ago'
2017年 06月 18日 星期日 21:07:22 CST
显示后一天
[root@hadoop101 ~]#date -d '-1 days ago'
2017年 06月 20日 星期日 21:07:22 CST
c.date 设置系统时间,这一个可能在相应的虚拟机同步的时候会用到
[root@hadoop101 ~]# date -s "2017-06-19 20:52:18"
d.查看日历
查看当前月的日历
[root@hadoop101 ~]# cal
查看当年的日历
[root@hadoop101 ~]# cal 2017
(4)用户管理命令
a.添加用户
[root@hadoop101 ~]# useradd tangseng
[root@hadoop101 ~]#ll /home/
b.设置密码
[root@hadoop101 ~]# passwd tangseng
c.查看用户
[root@hadoop101 ~]#id tangseng
d.切换用户
[root@hadoop101 ~]#su tangseng
e.删除用户
删除用户但保存用户主目录
[root@hadoop101 ~]#useradd zhubajie
[root@hadoop101 ~]#ll /home/
删除用户和用户主目录,都删除
[root@hadoop101 ~]#userdel -r zhubajie
[root@hadoop101 ~]#ll /home/
f.sudo设置普通用户拥有root权限
添加Yang用户,并对其设置密码。
[root@hadoop101 ~]#useradd Yang
[root@hadoop101 ~]#passwd Yang
修改配置文件
[root@hadoop101 ~]#vi /etc/sudoers
修改 /etc/sudoers 文件,找到下面一行(91行),在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
atguigu ALL=(ALL) ALL
修改完毕,现在可以用atguigu帐号登录,然后用命令 sudo ,即可获得root权限进行操作。
g.who 查看登录用户信息
显示自身用户名称
[root@hadoop101 opt]# whoami
显示登录用户的用户名与时间
[root@hadoop101 opt]# who am i
(5)用户组:这一部分感觉用不着,就不写了,懒得想了。
(6)文件权限类
a.文件属性
0首位表示类型,在Linux中第一个字符代表这个文件是目录、文件或链接文件等等
- 代表文件 d 代表目录 l 链接文档(link file);
第1-3位确定属主(该文件的所有者)拥有该文件的权限。---User
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,---Group
第7-9位确定其他用户拥有该文件的权限 ---Other
如果查看到是文件:链接数指的是硬链接个数。
如果查看的是文件夹:链接数指的是子文件夹个数。
b.chmod 改变权限
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
r=4 w=2 x=1 rwx=4+2+1=7
修改案例如下所示:
[root@hadoop101 ~]# cp xiyou/dssz/houge.txt ./
[root@hadoop101 ~]# chmod u+x houge.txt
[root@hadoop101 ~]# chmod 777 houge.txt
如果要是想要整个文件目录之中的东西都是可以进行相应的操作使用的命令是如下所示:
[root@hadoop101 ~]# chmod -R 777 xiyou/
c.chown 改变所有者
修改文件所有者
[root@hadoop101 ~]# chown atguigu houge.txt
[root@hadoop101 ~]# ls -al
-rwxrwxrwx. 1 atguigu root 551 5月 23 13:02 houge.txt
递归改变文件所有者和所有组
[root@hadoop101 xiyou]# ll
drwxrwxrwx. 2 root root 4096 9月 3 21:20 xiyou
[root@hadoop101 xiyou]# chown -R atguigu:atguigu xiyou/
[root@hadoop101 xiyou]# ll
drwxrwxrwx. 2 atguigu atguigu 4096 9月 3 21:20 xiyou
d.chgrp 改变所属组
[root@hadoop101 ~]# chgrp root houge.txt
[root@hadoop101 ~]# ls -al
-rwxrwxrwx. 1 atguigu root 551 5月 23 13:02 houge.txt
(7)搜索查找类
a.find进行相应的搜索的过程使用,注意这里的find是在知道在哪个文件夹之中的时候才是可以进行使用的。
按文件名:根据名称查找/目录下的filename.txt文件。
[root@hadoop101 ~]# find xiyou/ -name *.txt
按拥有者:查找/opt目录下,用户名称为-user的文件
[root@hadoop101 ~]# find xiyou/ -user atguigu
按文件大小:在/home目录下查找大于200m的文件(+n 大于 -n小于 n等于)
[root@hadoop101 ~]find /home -size +204800
b.locate快速定位文件路径,locate是直接进行使用的,进行查询一个文件夹。
[root@hadoop101 ~]# updatedb
[root@hadoop101 ~]#locate tmp
c.grep 过滤查找及“|”管道符
查找某文件在第几行
[root@hadoop101 ~]# ls | grep -n test
(8)压缩和解压类
a.gzip/gunzip 压缩
gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz文件)
gunzip 文件.gz (功能描述:解压缩文件命令)
注意这个地方,
(1)只能压缩文件不能压缩目录
(2)不保留原来的文件
(3)同时多个文件会产生多个压缩包
b.zip/unzip 压缩
zip [选项] XXX.zip 将要压缩的内容 (功能描述:压缩文件和目录的命令)
unzip [选项] XXX.zip (功能描述:解压缩文件)
zip选项 | 功能 |
-r | 压缩目录 |
unzip选项 | 功能 |
-d<目录> | 指定解压后文件的存放目录 |
c.tar 打包
选项 | 功能 |
-c | 产生.tar打包文件 |
-v | 显示详细信息 |
-f | 指定压缩后的文件名 |
-z | 打包同时压缩 |
-x | 解包.tar文件 |
-C | 解压到指定目录 |
这个命令就是经常使用的,无论是压缩还是进行解压的过程都是tar -zxvf ****
压缩多个文件
[root@hadoop101 opt]# tar -zcvf houma.tar.gz houge.txt bailongma.txt
压缩目录
[root@hadoop101 ~]# tar -zcvf xiyou.tar.gz xiyou/
解压到当前目录
[root@hadoop101 ~]# tar -zxvf houma.tar.gz
解压到指定目录
[root@hadoop101 ~]# tar -zxvf xiyou.tar.gz -C /opt
(9)磁盘分区类
a.df 查看磁盘空间使用情况,-h的使用是在显示的时候,使用M G等比较好看的方式显示。
[root@hadoop101 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 15G 3.5G 11G 26% /
tmpfs 939M 224K 939M 1% /dev/shm
/dev/sda1 190M 39M 142M 22% /boot
后面还有几个,但是我感觉用不到,等用到的时候再进行查询就是可以的。
(10)进程线程类
a.ps 查看当前系统进程状态
ps -aux | grep xxx (功能描述:查看系统中所有进程)
显示信息需要注意的地方
PID:进程的ID号
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源; ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
PID:进程ID
PPID:父进程ID
b.kill 终止进程:常用的kill -9 ****命令就是可以的。
c.pstree 查看进程树
显示进程pid
[root@hadoop101 datas]# pstree -p
显示进程所属用户
[root@hadoop101 datas]# pstree -u
d.top 查看系统健康状态(至今没有用到过,就不看了)
e.netstat 显示网络统计信息和端口占用情况
netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)
netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
(11)crontab 系统定时任务 【没有用到过】
5.软件包管理
(1)RPM
a.概述
RPM(RedHat Package Manager),RedHat软件包管理工具,类似windows里面的setup.exe是Linux这系列操作系统里面的打包安装工具,它虽然是RedHat的标志,但理念是通用的。
RPM包的名称格式:Apache-1.3.23-11.i386.rpm
- “apache” 软件名称
- “1.3.23-11”软件的版本号,主版本和此版本
- “i386”是软件所运行的硬件平台,Intel 32位处理器的统称
- “rpm”文件扩展名,代表RPM包
b.RPM查询命令(rpm -qa)
查询firefox软件安装情况
[root@hadoop101 Packages]# rpm -qa |grep firefox
firefox-45.0.1-1.el6.centos.x86_64
c.RPM卸载命令(rpm -e)
选项 | 功能 |
-e | 卸载软件包 |
--nodeps | 卸载软件时,不检查依赖。这样的话,那些使用该软件包的软件在此之后可能就不能正常工作了。 |
卸载firefox软件
[root@hadoop101 Packages]# rpm -e firefox
d.RPM安装命令(rpm -ivh)
选项 | 功能 |
-i | -i=install,安装 |
-v | -v=verbose,显示详细信息 |
-h | -h=hash,进度条 |
--nodeps | --nodeps,不检测依赖进度 |
安装firefox软件
[root@hadoop101 Packages]# pwd
/run/media/root/CentOS 7 x86_64/Packages
[root@hadoop101 Packages]# rpm -ivh firefox-45.0.1-1.el6.centos.x86_64.rpm
warning: firefox-45.0.1-1.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:firefox ########################################### [100%]
(2)YUM仓库配置
a.概述
将其想成是Maven就可以,可以自动处理依赖关系。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
b.常用的命令
选项说明
选项 | 功能 |
-y | 对所有提问都回答“yes” |
参数说明
参数 | 功能 |
install | 安装rpm软件包 |
update | 更新rpm软件包 |
check-update | 检查是否有可用的更新rpm软件包 |
remove | 删除指定的rpm软件包 |
list | 显示软件包信息 |
clean | 清理yum过期的缓存 |
deplist | 显示yum软件包的所有依赖关系 |
使用yum的方式进行安装相应的firefox,如下所示
[root@hadoop101 ~]#yum -y install firefox.x86_64
c.修改网络YUM源
默认的系统YUM源,需要连接国外apache网站,网速比较慢,可以修改关联的网络YUM源为国内镜像的网站,比如网易163,aliyun等。
1)安装wget, wget用来从指定的URL下载文件
[root@hadoop101 ~] yum install wget
2)在/etc/yum.repos.d/目录下,备份默认的repos文件
[root@hadoop101 yum.repos.d] pwd
/etc/yum.repos.d
[root@hadoop101 yum.repos.d] cp CentOS-Base.repo CentOS-Base
.repo.backup
3)下载网易163或者是aliyun的repos文件,任选其一
[root@hadoop101 yum.repos.d] wget
http://mirrors.aliyun.com/repo/Centos-7.repo //阿里云
[root@hadoop101 yum.repos.d] wget
http://mirrors.163.com/.help/CentOS7-Base-163.repo //网易163
4)使用下载好的repos文件替换默认的repos文件。例如:用CentOS7-Base-163.repo替换CentOS-Base.repo
[root@hadoop101 yum.repos.d]# mv CentOS7-Base-163.repo CentOS-Base.repo
5)清理旧缓存数据,缓存新数据
[root@hadoop101 yum.repos.d]#yum clean all
[root@hadoop101 yum.repos.d]#yum makecache
yum makecache就是把服务器的包信息下载到本地电脑缓存起来
6)测试
[root@hadoop101 yum.repos.d]# yum list | grep firefox
[root@hadoop101 ~]#yum -y install firefox.x86_64
6.常见错误及解决方案
虚拟化支持异常情况,这个情况我记得在上大三实习的时候遇到过,如下几种情况
问题原因:宿主机BIOS设置中的硬件虚拟化被禁用了
解决办法:需要打开笔记本BIOS中的IVT对虚拟化的支持
针对于不同版本的电脑,进入BIOS的方式还是不一样的,需要在网上进行查找可以使用的方式。
7.企业面试题
(1)百度&考满分
问题:Linux常用命令
参考答案:find、df、tar、ps、top、netstat等。(尽量说一些高级命令)
(2)瓜子二手车
问题:Linux查看内存、磁盘存储、io 读写、端口占用、进程等命令
1、查看内存:top,在显示信息的第四第五行之中存在相应的内存信息。在本篇之中没有写到top是如何进行使用,查了一下博客,可以参考下面的这个博客
Linux运维之top命令解析_linux top命令_宗而研之的博客-CSDN博客
2、查看磁盘存储情况:df -h
3、查 看磁盘IO读写情况:iotop(需要安装一下:yum install iotop)、iotop -o(直接查看输出比较高的磁盘读写程序)
4、查看端口占用情况:netstat -tunlp | grep 端口号
5、查看进程:ps -aux
Shell
1.Shell概述
Shell是一个命令行解析器,用来接收外部程序命令,进而调制Linux内核。
1)Linux提供的Shell解析器有:
[atguigu@hadoop101 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
2)bash和sh的关系
[atguigu@hadoop101 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5月 11 2016 bash
lrwxrwxrwx. 1 root root 4 5月 27 2017 sh -> bash
3)Centos默认的解析器是bash,这个地方需要进行特别的注意,因为其提供的解析器是bash,这就解释了为什么我们在写shell脚本的时候,使用的是#!/bin/bash开头了。脚本以#!/bin/bash开头(指定解析器)
[atguigu@hadoop102 bin]$ echo $SHELL
/bin/bash
2.Shell脚本入门
(1)脚本格式
脚本以#!/bin/bash开头(指定解析器)
(2)创建第一个脚本
打印hello world
[atguigu@hadoop101 datas]$ touch helloworld.sh
[atguigu@hadoop101 datas]$ vi helloworld.sh
#!/bin/bash
echo "helloworld"
(3)脚本执行方式
第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
[atguigu@hadoop101 datas]$ bash helloworld.sh
第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
[atguigu@hadoop101 datas]$ chmod +x helloworld.sh
[atguigu@hadoop101 datas]$ ./helloworld.sh
3.变量
(1)系统预定义变量:$HOME、$PWD、$SHELL、$USER等
(2)自定义变量
a.基本语法
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly变量,注意:不能unset
[atguigu@hadoop101 datas]$ readonly B=2
[atguigu@hadoop101 datas]$ echo $B
2
[atguigu@hadoop101 datas]$ B=9
-bash: B: readonly variable
b.变量定义规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
等号两侧不能有空格.
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
[atguigu@hadoop102 ~]$ C=1+2
[atguigu@hadoop102 ~]$ echo $C
1+2
变量的值如果有空格,需要使用双引号或单引号括起来。
[atguigu@hadoop102 ~]$ D=I love banzhang
-bash: world: command not found
[atguigu@hadoop102 ~]$ D="I love banzhang"
[atguigu@hadoop102 ~]$ echo $D
I love banzhang
可把变量提升为全局环境变量,可供其他Shell程序使用
export 变量名
(3)特殊变量
a.$n
1)基本语法
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
2)案例实操
[atguigu@hadoop101 datas]$ touch parameter.sh
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[atguigu@hadoop101 datas]$ chmod 777 parameter.sh
[atguigu@hadoop101 datas]$ ./parameter.sh cls xz
./parameter.sh cls xz
b.$#
1)基本语法
$# (功能描述:获取所有输入参数个数,常用于循环)。
2)案例实操
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[atguigu@hadoop101 datas]$ chmod 777 parameter.sh
[atguigu@hadoop101 datas]$ ./parameter.sh cls xz
parameter.sh cls xz
2
c.$*、$@
1)基本语法
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
注意:如果想让$*和$@ 体现区别必须用双引号括起来才生效
2)案例实操
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[atguigu@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh 1 2
3
1 2 3
1 2 3
d.$?
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
如下所示,判断helloworld.sh脚本是否正确执行
[atguigu@hadoop101 datas]$ ./helloworld.sh
hello world
[atguigu@hadoop101 datas]$ echo $?
0
4.运算符
“$((运算式))”或“$[运算式]”
[atguigu@hadoop101 datas]# S=$[(2+3)*4]
[atguigu@hadoop101 datas]# echo $S
5.条件判断
(1)基本语法
test condition
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
2)常用判断条件
a.两个整数之间比较
== 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
b.按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)-x 有执行的权限(execute)
c.按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)-e 文件存在(existence) -d 文件存在并是一个目录(directory)
d.实际操作
23是否大于等于22
[atguigu@hadoop101 datas]$ [ 23 -ge 22 ]
[atguigu@hadoop101 datas]$ echo $?
0
helloworld.sh是否具有写权限
[atguigu@hadoop101 datas]$ [ -w helloworld.sh ]
[atguigu@hadoop101 datas]$ echo $?
0
/home/atguigu/cls.txt目录中的文件是否存在
[atguigu@hadoop101 datas]$ [ -e /home/atguigu/cls.txt ]
[atguigu@hadoop101 datas]$ echo $?
1
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[atguigu@hadoop101 ~]$ [ condition ] && echo OK || echo notok
OK
[atguigu@hadoop101 datas]$ [ condition ] && [ ] || echo notok
notok
6.流程控制(重点)
这部分的流程控制是比较重要的,具体的格式是具体分析就是可以的。实际需要可能也是需要写一些脚本之类的。
(1) if判断
1)基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
a.[ 条件判断式 ],中括号和条件判断式之间必须有空格
b.if后要有空格
2)案例实操
输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。
[atguigu@hadoop101 datas]$ touch if.sh
[atguigu@hadoop101 datas]$ vim if.sh
#!/bin/bash
if [ $1 -eq "1" ]
then
echo "banzhang zhen shuai"
elif [ $1 -eq "2" ]
then
echo "cls zhen mei"
fi
[atguigu@hadoop101 datas]$ chmod 777 if.sh
[atguigu@hadoop101 datas]$ ./if.sh 1
banzhang zhen shuai
(2) case语句
1)基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
a.case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
b.双分号“;;”表示命令序列结束,相当于java中的break。
c.最后的“*)”表示默认模式,相当于java中的default。
2)案例实操
输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。
[atguigu@hadoop101 datas]$ touch case.sh
[atguigu@hadoop101 datas]$ vim case.sh
!/bin/bash
case $1 in
"1")
echo "banzhang"
;;
"2")
echo "cls"
;;
*)
echo "renyao"
;;
esac
[atguigu@hadoop101 datas]$ chmod 777 case.sh
[atguigu@hadoop101 datas]$ ./case.sh 1
1
(3)for循环
1)基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
2)案例实操
[atguigu@hadoop101 datas]$ touch for1.sh
[atguigu@hadoop101 datas]$ vim for1.sh
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
[atguigu@hadoop101 datas]$ chmod 777 for1.sh
[atguigu@hadoop101 datas]$ ./for1.sh
“5050”
3)基本语法2
for 变量 in 值1 值2 值3…
do
程序
done
4)案例实操
[atguigu@hadoop101 datas]$ touch for2.sh
[atguigu@hadoop101 datas]$ vim for2.sh
#!/bin/bash
#打印数字
for i in $*
do
echo "ban zhang love $i "
done
[atguigu@hadoop101 datas]$ chmod 777 for2.sh
[atguigu@hadoop101 datas]$ bash for2.sh cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
之前提到一个$@与$*的区别,但是没有进行真正的比较。
$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
[atguigu@hadoop101 datas]$ touch for.sh
[atguigu@hadoop101 datas]$ vim for.sh
#!/bin/bash
for i in $*
do
echo "ban zhang love $i "
done
for j in $@
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 datas]$ bash for.sh cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
[atguigu@hadoop101 datas]$ vim for.sh
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "ban zhang love $i"
done
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 datas]$ chmod 777 for.sh
[atguigu@hadoop101 datas]$ bash for.sh cls xz bd
ban zhang love cls xz bd
ban zhang love cls
ban zhang love xz
用自己的语言进行解释就是,如果要是"$*"就是执行一次,如果要是"$@"执行多次。
(4)while循环
1)基本语法
while [ 条件判断式 ]
do
程序
done
2)案例实操
[atguigu@hadoop101 datas]$ touch while.sh
[atguigu@hadoop101 datas]$ vim while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
[atguigu@hadoop101 datas]$ chmod 777 while.sh
[atguigu@hadoop101 datas]$ ./while.sh
5050
7.read读取控制台输入
read(选项)(参数)
选项:-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒)。
参数:变量:指定读取值的变量名
案例:提示7秒内,读取控制台输入的名称
[atguigu@hadoop101 datas]$ touch read.sh
[atguigu@hadoop101 datas]$ vim read.sh
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
[atguigu@hadoop101 datas]$ ./read.sh
Enter your name in 7 seconds xiaoze
xiaoze
8.函数
(1)系统函数
a. basename
basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt
banzhang.txt
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt .txt
banzhang
b.dirname
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu
(2)自定义函数
自定义函数的语法如下所示:
#定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
#调用函数
funname
注意事项:
①必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
②函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
[atguigu@hadoop101 datas]$ touch fun.sh
[atguigu@hadoop101 datas]$ vim fun.sh
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
[atguigu@hadoop101 datas]$ chmod 777 fun.sh
[atguigu@hadoop101 datas]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7
9.Shell工具
(1)cut
cut [选项参数] filename
选项参数 | 功能 |
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列 |
-c | 指定具体的字符 |
操作案例:
a.准备数据
[atguigu@hadoop101 datas]$ touch cut.txt
[atguigu@hadoop101 datas]$ vim cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
b.切割cut.txt第一列
[atguigu@hadoop101 datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
c.切割cut.txt第二、三列
[atguigu@hadoop101 datas]$ cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
le
d.在cut.txt文件中切割出guan
[atguigu@hadoop101 datas]$ cat cut.txt | grep "guan" | cut -d " " -f 1
guan
e.选取系统PATH变量值,第2个“:”开始后的所有路径:
[atguigu@hadoop101 datas]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
[atguigu@hadoop102 datas]$ echo $PATH | cut -d: -f 2-
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
f.切割ifconfig 后打印的IP地址
[atguigu@hadoop101 datas]$ ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d" " -f1
192.168.1.102
(2)awk
1)基本用法
awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
2)选项参数说明
选项参数 | 功能 |
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
3)案例
①只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"dahaige,/bin/zuishuai"
[atguigu@hadoop102 datas]$ awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
。。。
atguigu,/bin/bash
dahaige,/bin/zuishuai
注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
②将passwd文件中的用户id增加数值1并输出
[atguigu@hadoop102 datas]$ awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4
4)内置变量
变量 | 说明 |
FILENAME | 文件名 |
NR | 已读的记录数(行数) |
NF | 浏览记录的域的个数(切割后,列的个数) |
统计passwd文件名,每行的行号,每行的列数
[atguigu@hadoop102 datas]$ awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' passwd
filename:passwd, linenumber:1,columns:7
filename:passwd, linenumber:2,columns:7
filename:passwd, linenumber:3,columns:7
切割IP
[atguigu@hadoop102 datas]$ ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}'
192.168.1.102
查询cut.txt中空行所在的行号
[atguigu@hadoop102 datas]$ awk '/^$/{print NR}' cut.txt
5
(3)sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
1)基本语法
sort(选项)(参数)
选项 | 说明 |
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
2)案例实操
数据准备
[atguigu@hadoop102 datas]$ touch sort.sh
[atguigu@hadoop102 datas]$ vim sort.sh
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
按照“:”分割后的第三列倒序排序
[atguigu@hadoop102 datas]$ sort -t : -nrk 3 sort.sh
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6
10.正则表达式
(1)常规匹配
一串不包含特殊字符的正则表达式匹配它自己,例如:
[atguigu@hadoop102 datas]$ cat /etc/passwd | grep atguigu
就会匹配所有包含atguigu的行
(2)常用特殊字符
1)特殊字符:^
^ 匹配一行的开头,例如:
[atguigu@hadoop102 datas]$ cat /etc/passwd | grep ^a
会匹配出所有以a开头的行。
2)特殊字符:$
$ 匹配一行的结束,例如
[atguigu@hadoop102 datas]$ cat /etc/passwd | grep t$
会匹配出所有以t结尾的行
3)特殊字符:.
. 匹配一个任意的字符,例如
[atguigu@hadoop102 datas]$ cat /etc/passwd | grep r..t
会匹配包含rabt,rbbt,rxdt,root等的所有行
4)特殊字符:*
* 不单独使用,他和左边第一个字符连用,表示匹配上一个字符0次或多次,例如
会匹配rt, rot, root, rooot, roooot等所有行
.* 匹配任何字符
5)特殊字符:[ ]
[ ] 表示匹配某个范围内的一个字符,例如
[6,8]------匹配6或者8
[a-z]------匹配一个a-z之间的字符
[a-z]*-----匹配任意字母字符串
[a-c, e-f]-匹配a-c或者e-f之间的任意字符
[atguigu@hadoop102 datas]$ cat /etc/passwd | grep r[a,b,c]*t
会匹配rat, rbt, rabt, rbact等等所有行
6)特殊字符:\
\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 '$' 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如
[atguigu@hadoop102 datas]$ cat /etc/passwd | grep a\$b
注意:直接匹配 $ 字符,需要进行转义并且加上单引号
就会匹配所有包含 a$b 的行。