一. 文件属性分类
文件属性分类:
索引信息
属主信息
属组信息
软硬链接
时间信息
权限信息
类型信息
大小信息
[root@shiyi ~ 15:24:28]# ll -i /bonian/
51206131 d rwxr-xr-x 2 root root 57 Dec 13 09:18 bonian01
17391346 d rwxr-xr-x 2 root root 24 Dec 17 09:22 bonian02
索引 inode号 文件类型 文件权限 硬链接数 属主 属组 文件大小 文件时间
1. 文件属性索引信息:
inode
概念说明: 数据文件索引信息, 类似目录
作用说明: 存储文件数据属性信息
文件数据指针信息
诞生过程: 格式化 --> 创建文件系统 --> 创建inode
查看方法: df -i
block
概念说明: 真正存储数据区域
作用说明: 存储文件真正数据内容
诞生过程: 格式化 --> 创建文件系统 --> 创建block
查看方法: df
索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。
一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。
系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号(也就是inode号)。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。
这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。
这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
问题一:
磁盘空间不够了: 如何处理
思路一: 磁盘inode是否够用
用来储存文件信息的inode已经耗尽,而block却未必用完
思路二: 磁盘block是否够用
问题二:
一个数据会占用一个inode, 占用多个block
一个block块是大点好 小点好
说明: 10K文件 --> 1个block 4k --> 3个block
磁盘IO(input output)输入输出的次数, 决定磁盘性能
10M 消耗block少 IO次数少 硬盘性能没有影响
10G 消耗block多 IO次数多 硬盘性能会有下降
存储数据大文件数据 视频10G/图片/音频 block更大些 IO消耗减少
存储数据小文件数据 文档 代码 block更小些 节省磁盘空间
如何创建文件系统: 如何格式化
数据读取原理: inode block
2. 文件属性用户信息:
用户分类说明:
属主 属组 其他用户
oldboy.txt -- 创造者 oldboy rwx
属组 oldgirl olddog oldbaby --> oldboy组 rw-
alex tony kinve r--
系统用户分类:
超级管理员 皇帝 root user id uid信息: 0
虚拟用户 傀儡 nobody uid: 1-999 centos7
特点01: 不能登录系统 管理服务进程信息
uid: 1-499 centos6
特点02: 没有家目录
普通用户 平民 oldboy uid: 1000+ centos7
uid: 500+ centos6
用户和用户组关系:
1 vs 1 关系: 1个用户 属于 1个组
1 vs 多 关系: 1个用户 属于 多个组
多 vs 1 关系: 多个用户 属于 1个组
多 vs 多 关系: 多个用于 属于 多个组
oldboy --> /etc/hosts -- oldbg 设置权限
oldgirl --> /etc/hosts
olddog --> /etc/rc.local
oldbaby --> /etc/rc.local
3. 文件属性链接信息:
软链接 | 硬链接 |
---|---|
文件数据快捷方式 | 查看数据内容的门 |
软链接会指向源文件 | 硬链接会指向和源文件相同的inode号 |
如果源文件删除,则软链接失效 | 如果源文件删除,硬链接不受影响 |
可以给目录创建软链接 | 只能给普通文件创建硬链接 |
link[ln -s 源文件 软链接] | link[ln 源文件 硬链接] |
利用软连接进行文件快捷管理 减少开发人员工作量 | 利用硬链接对大文件进行备份 防止误删除 |
创建的目录------默认有2条硬链接
创建的文件------默认有1条硬链接
4. 文件属性时间信息:
属性分类:
atime: access time --- 访问时间
mtime: modify time --- 修改时间
ctime: change time --- 改变时间
stat 文件 --- 查看文件详细属性信息(详细时间信息)
# cat oldboy.txt
# stat oldboy.txt
Access: 2020-01-23 01:00:09.122458448 +0800 --- 访问时间信息
Modify: 2020-01-23 00:59:32.244456300 +0800
Change: 2020-01-23 00:59:32.244456300 +0800
# echo oldboy69 >oldboy.txt
# stat oldboy.txt
Access: 2020-01-23 01:00:09.122458448 +0800
Modify: 2020-01-23 01:01:30.050463164 +0800 --- 修改时间信息
Change: 2020-01-23 01:01:30.050463164 +0800 --- 影响文件大小属性
# chmod 700 oldboy.txt
# stat oldboy.txt
Access: 2020-01-23 01:00:09.122458448 +0800
Modify: 2020-01-23 01:01:30.050463164 +0800
Change: 2020-01-23 01:03:27.084469984 +0800 --- 文件属性信息发生变化
和时间有关的命令: timedatectl
date --- 查看时间信息/设置修改时间
查看时间信息:
指定时间显示格式: # date '+%Y-%m-%d %H:%M:%S 星期%w'
%Y: 年份信息
%m: 月份信息 ---> %F
%d: 日期信息
%H: 小时信息
%M: 分钟信息 ---> %T
%S: 秒信息
cp /etc/hosts /etc/hosts.`date '+%F_%T_星期%w'`
指定查看未来或过去时间:
date -d "-n day" --- 显示过去时间
date -d "+n day" --- 显示未来时间
修改时间信息:
date -s "年份月份日期"
date -s "小时分钟秒"
5. 文件属性大小信息:
文件的属性中“大小”指的是,你的文件的容量,它有多大容量,就占多大内存,就像东西有多大体积,就占多大空间一样。
“大小”的单位有:EB,PB,TB,GB,MB,KB,B(字节)等
1EB=1024PB 1PB=1024TB 1TB=1024GB
1GB=1024MB 1MB=1024KB 1KB=1024B(字节) 1个汉字占两个字节
1MB如果纯粹储存汉字的话可储存50万汉字.但硬盘标识为80G的话,实际没有这么大的,因为硬盘生产商一般是按1MB=1000KB计算的
6. 文件属性类型信息:
1. 查看文件类型的三种方法:
ls-l/ls-ld 或者ll [ls-l —查看文件 ls-ld —查看路径 ll —-跟ls -l 一样]
file 命令
stat 命令
2. 文件分类介绍(部分):
普通文件:Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);
各种压缩文件.第一个属性为 [-]
文本文件:
二进制文件(命令文件)
数据文件(压缩文件)
file 文件信息 --- 获取文件类型
d 目录文件:就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]
l 连接文件(软链接):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]
c 字符流文件:字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]
b block块文件 存储设备文件信息
就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是/dev/hda1等文件。第一个属性为 [b]
s socket文件(网络编程):这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。
第一个属性为 [s],最常在 /var/run目录中看到这种文件类型
p FIFO(管道文件):一种特殊的文件类型,主要是解决多个程序同时存取一个文件所造成的错误。
FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]
3. 特殊扩展名标记文件
xxx.txt --- 文本文件
xxx.log --- 日志文件
xxx.conf --- 配置文件
xxx.sh --- shell脚本文件
xxx.py --- python脚本文件
xxx.zip/xxx.gz/xxx.tar.gz --- 压缩文件
xxx.db --- 数据库文件 database 数据(表01 表02 表03)=库 == 更加完善 功能更强 excel
xxx.rpm --- 表示rpm安装包文件
xxx.conf --- 表示系统服务的配置文件
xxx.html、.htm、.php、.jsp、.do --- 表示网页语言的文件
xxx.sh --- 表示shell脚本文件,通过shell语言开发的程序。
xxx.pl --- 表示perl语言文件,通过perl语言开发的程序。
xxx.py --- 表示python语言文件,通过python语言开发的程序
4. 补充: 和文件相关命令
which --- 查看命令文件保存路径
whereis --- 查看命令文件保存路径 以及 查看命令相关文件保存路径
locate --- 快速检索一个文件保存的路径 == everything
yum install -y mlocate
updatedb
file命令:
命令作用:
用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。
命令参数:
-b 列出文件辨识结果时,不显示文件名称。
-c 详细显示指令执行过程,便于排错或分析程序执行的情形
-f 列出文件中文件名的文件类型
-F 使用指定分隔符号替换输出文件名后的默认的":"分隔符。
-i 输出mime类型的字符串
-L 查看对应软链接对应文件的文件类型
-z 尝试去解读压缩文件的内容
实战演练:
查看文件类型:
file 文件 显示文件名称
file -b 文件 不显示文件名称
[root@shiyi bonian02 15:25:10]# file person.txt
person.txt: ASCII text ==> 文本文件
[root@shiyi bonian02 15:41:27]# file -b person.txt
ASCII text
显示mime类型的字符串:
[root@shiyi bonian02 15:46:36]# file -i person.txt
person.txt: text/plain; charset=us-ascii
查看文件中的文件名的文件类型:
[root@shiyi bonian02 15:52:28]# file -f person.txt
101,oldboy,CEO: cannot open (No such file or directory)
102,zhaoyao,CTO: cannot open (No such file or directory)
103,Alex,COO: cannot open (No such file or directory)
104,yy,CFO: cannot open (No such file or directory)
105,feixue,CIO: cannot open (No such file or directory)
106,oldboy,CRO: cannot open (No such file or directory)
107,zhaoyao,CQO: cannot open (No such file or directory)
108,Alex,CPO: cannot open (No such file or directory)
109,zhangsan,CNO: cannot open (No such file or directory)
解读压缩文件:
[root@shiyi ~ 15:54:52]# file -z /bonian/oldboy.tar.gz
/bonian/oldboy.tar.gz: POSIX tar archive (GNU)
(gzip compressed data, from Unix, last modified: Fri Dec 13 18:10:55 2019)
查看软链接对应的文件的文件类型:
[root@shiyi bonian02 15:59:15]# file -L bonian01_link/
bonian01_link/: directory
7. 文件属性权限信息:
rw- r-- r-- 文件权限包含9个权限位 12位权限
属主 属组 其他用户
属主: 读r 写w 执行x - 没权限
属组: 只有读权限
其他用户: 只有读权限
r-xr---- 文件权限解释: 属主(读权限和执行权限) 属组(可读权限)
540 其他用户(没有任何权限)
rwxrw-rw- 文件权限解释: 属主(读写执行) 属组(读写)
766 其他用户(读写)
-w-r-xr-- 文件权限解释: 属主(写权限) 属组(读权限和执行)
254 其他用户(读权限)
r - 4 每三位权限为一组, 做求和运算 数值进行输出
w - 2
x - 1
- - 0
666 670 776 771 --> 符号表示
rw-rw-rw- rw-rwx--- rwxrwxrw- rwxrwx--x
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx
1. 系统权限信息:
r(4) 读权限:
· 文件信息: 内容信息可以读取
· 目录信息: 查看目录数据信息
w(2) 写权限
· 文件信息: 内容信息可以编辑
· 目录信息: 操作目录数据信息(删除数据/创建数据/移动数据/修改数据名称)
x(1) 执行权限:
· 文件信息: 文件可以进行执行 /etc/rc.local
· 目录信息: 目录可以进行切换
2. 系统权限分配方式:
rwx 第一组权限: 分配给属主用户
rw- 第二组权限: 分配给属组用户
r-- 第三组权限: 分配给其他用户
PS: 系统常用权限位: 9位权限位 实际是为12位 (面试)
3. 系统权限配置方法:
rwx- 000~777 001 002 003
4. 文件权限说明:
1)没有权限
管理员用户(root): 读、写权限都可以执行,但是没有执行权限。
数据属主信息: 只有写权限可以执行,但是没有读和执行权限;
且写权限不完全,会覆盖前一次的内容。
数据其他用户: 任何权限都不能执行。
2)只有读权限
管理员用户(root): 读、写权限都可以执行,但是没有执行权限。
数据属主信息: 读写权限都可以执行,但是没有执行权限。
数据其他用户: 只有读权限可以执行,但是没有写和执行权限。
3)只有写权限
管理员用户(root): 读、写权限都可以执行,但是没有执行权限。
数据属主信息: 只有写权限可以执行,但是没有读和执行权限;
且写权限不完全,会覆盖前一次的内容。
数据其他用户: 只有写权限可以执行,但是没有读和执行权限;
且写权限不完全,会覆盖前一次的内容。
4)只有执行权限
管理员用户(root): 读、写和执行权限都可以执行。
数据属主信息: 只有写权限可以执行,但是没有读和执行权限;
且写权限不完全,会覆盖前一次的内容。
数据其他用户: 任何权限都不能执行。
5. 目录权限说明:
1)没有权限
管理员用户(root): 读、写和执行权限都可以执行。
数据属主信息: 任何权限都不能执行。
数据其他用户: 任何权限都不能执行。
2)只有读权限
管理员用户(root): 读、写和执行权限都可以执行。
数据属主信息: 只有读权限可以执行,但是没有写和执行权限;
且读权限不完全,不会显示inode信息,只有block信息。
数据其他用户: 只有读权限可以执行,但是没有写和执行权限;
且读权限不完全,不会显示inode信息,只有block信息。
3)只有写权限
管理员用户(root): 读、写和执行权限都可以执行。
数据属主信息: 任何权限都不能执行。
数据其他用户: 任何权限都不能执行。
4)只有执行权限
管理员用户(root): 读、写和执行权限都可以执行。
数据属主信息: 只有执行权限可以执行,但是没有读和写权限。
数据其他用户: 只有执行权限可以执行,但是没有读和写权限。
======================================================================
进行权限修改: chmod 权限信息 数据信息
属主修改权限: chmod u+/-/= 属主 user
属组修改权限: chmod g+/-/= 属组 group
其他用户修改: chmod o+/-/= 属组 other
同时三种用户都做权限修改:
rw- r-- --- chmod 640
======================================================================
二. 正则表达式
1. 正则符号信息
1)系统基础符号:
美元符号:$
用于取出变量中的内容
[root@shiyi ~ 14:19:14]# abc=123
[root@shiyi ~ 16:17:59]# echo $abc
123
用于取出指定列的信息(awk)
表示用户命令提示符号
[oldboy01@shiyi ~ 16:44:20]$ ----普通用户
[root@shiyi ~ 16:44:25]# --------超级管理员
表示一行的结尾
叹号符号:!
用于表示取反或者排除意思
命令行中表示取出最近命令
!awk(慎用)
history|grep awk
history -c -w
ctrl+r
用于表示强制操作处理
vim底行模式保存 退出 wq! q!
竖线符号:| 表示管道符号,管道前面命令,交给管道后面执行
经常配合xargs命令使用
查找指定数据信息进行删除
find /oldboy -type f -name "oldboy*.txt"|xargs rm
find /oldboy -type f -name "oldboy*.txt" -exec rm -rf {} \;
find /oldboy -type f -name "oldboy*.txt" -delete
查找指定数据信息进行复制
find /oldboy -type f -name "oldboy*.txt" |xargs -i cp {} /oldgirl/
find /oldboy -type f -name "oldboy*.txt" |xargs cp -t /oldgirl/
find /oldboy -type f -name "oldboy*.txt" -exec cp -a {} /oldgirl \;
查找指定数据信息进行移动
find /oldboy -type f -name "oldboy*.txt" |xargs -i mv {} /oldgirl/
find /oldboy -type f -name "oldboy*.txt" |xargs mv -t /oldgirl/
find /oldboy -type f -name "oldboy*.txt" -exec mv {} /oldgirl \;
查找指定数据信息按照日期
查找7天以前的数据: find /oldboy -type f -mtime +7
查找最近7天的数据: find /oldboy -type f -mtime -7
查找距今第7天数据: find /oldboy -type f -mtime 7
主要用于批量删除历史数据信息
产生输出的信息|grep xxx
rpm -qa | grep vim
井号符号:#
表示文件内容注释符号
表示用户命令提示符号
超级用户为 #
普通用户为 $
2) 引号符号系列
美元括号:$() == ``
表示命令执行结果留下,用于其他命令调用
引号符号:
· 双引号 "" : 表示输入内容,就是输出内容,但是部分信息会被解析
· 单引号 '' : 表示输入内容,就是输出内容(所见即所得)
· 反引号 `` : 表示命令执行结果留下,用于其他命令调用
· 没引号 : 表示和双引号功能类似, 但是可以识别序列信息 {}
3) 定向符号系列
小于符号:单个小于符号 < 标准输入重定向符号
tr 'a-z' 'A-Z' < oldboy.txt
xargs -n2 < oldboy01.txt
两个小于符号 << 标准输入追加重定向符号
cat >> oldboy.txt <<EOF
oldboy01
oldboy02
oldboy03
EOF
大于符号:单个大于符号 1>/> 标准输出重定向符号
2> 错误输出重定向符号
两个大于符号 1>>/>> 标准输出追加重定向符号
2>> 错误输出追加重定向符号
4) 路径符号系列
单点符号:find ./ 表示当前目录
双点符号:cd .. 表示上级目录
波浪符号:cd ~ 表示用户家目录信息
超级用户:/root
普通用户:/home/用户名称
横线符号:cd - 两个目录路间进行切换
OLDPWD: 保存用户切换目录之前的所在路径信息
5) 系统逻辑符号:
&& : 前一件事执行成功了, 在执行&& 后面的命令
|| : 前一件事执行失败了, 在执行|| 后面的命令
; : 不管前面命令成功与否, 都会执行分号后面的命令
6)系统通配符号:
* 匹配任意字符或者字符串信息
# ll /oldboy/*.txt
-rw-r--r-- 1 root root 24 Dec 17 10:58 /oldboy/oldboy01.txt
-rw-r--r-- 1 root root 78 Dec 17 10:59 /oldboy/oldboy.txt
{} 匹配生成序列信息
数字序列: {01..10} 奇数序列 {01..10..2} 偶数序列 echo {00..10..2}
字母序列: {a..z}
组合序列:
#1对多
# echo 1{a..c}
1a 1b 1c
#多对多
# echo {1..3}{a..c}
1a 1b 1c 2a 2b 2c 3a 3b 3c
#多对1
#echo {1..3}a
1a 2a 3a
# echo A{,B} ---> 实现快速备份数据 cp /oldboy/oldboy.txt{,.bak}
A AB
# echo A{B,} ---> 实现快速还原数据 cp /oldboy/oldboy.txt{.bak,}
AB A
7)系统正则符号:
特点(概念):
正则符号主要用于匹配字符信息
正则符号主要匹配文件内容信息
正则符号主要匹配的是文件名称
正则符号只有三剑客命令可以识别
正则符号可以用于分析数据
基础正则符号(grep sed awk):
^ 匹配以什么开头的信息 文件名称以什么信息开头
$ 匹配以什么结尾的信息 文件名称以什么信息结尾
^$ 匹配空行信息
. 匹配任意一个字符
* 匹配符号前面一个字符连续出现0次或者多次
.* 匹配任意字符
\ 转义(将意思进行转变)符号
\t ---制表符号 \n ---换行符号 \r ---换行符
[] 匹配多个字符信息
[^] 匹配多个字符信息并进行取反
扩展正则符号(egrep/grep -E sed -r awk):
+ 匹配符号前面一个字符连续出现1次或者多次
? 匹配符号前面一个字符连续出现0次或者1次
{} 匹配符号前面一个字符连续出现指定次数
{n,m} 匹配到的字符最少出现n次,最多出现m次
{,m} 匹配到的字符最少0次,最多出现m次
{n,} 匹配到的字符最少出现n次,最多0次
{n} 匹配到的字符正好n次
| 匹配多个字符串信息
() 将多个字符信息汇总成一个整体
后项引用前项信息
============================================================================
补充: 如何查看一行后面是否有空格
方法一:
cat -A 文件信息
方法二:
vim 文件信息---> :set list
============================================================================
附赠补充正则符号和其他正则部分组合符号
[a-z0-9A-Z] 表示字符范围
\+ 一次或多次
\? 零次或一次
\| 表示或语法
8)实际操作
1>在某文件中找出以“m”开头的文件行
grep "^m" 文件
例如:
[root@znix ~]# grep "^m" oldboy.txt
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!
2>在某文件中找出以“m”结尾的文件行
grep "m$" 文件
例如:
[root@znix ~]# grep "m$" oldboy.txt
my blog is http://oldboy.blog.51cto.com
3>在某文件中找出以“a”开头并且以“b”结尾的文件行
grep "^a.*b$" 文件
[root@znix ~]# grep "^a.*b$" oldboy.txt
ankh ohma zi-o grond zi-o honeycomb
4>在某文件中找出以“oldb”开始并且以“d”结尾的单词所在行
grep "oldb.y" 文件
例如:
[root@znix ~]# grep "oldb.y" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@znix ~]# grep -o "oldb.y" oldboy.txt
oldboy
oldboy
oldbey
5>在某文件中匹配“o”的出现次数
grep ""
[root@oldboy69 oldboy 08:49:54]# grep "g.d" test01.txt
god
[root@oldboy69 oldboy 08:50:28]# grep "g..d" test01.txt
good
[root@oldboy69 oldboy 08:50:49]# grep "g...d" test01.txt
goood
[root@oldboy69 oldboy 08:50:53]# grep ".d" test01.txt
gd
god
good
goood
gooood
[root@oldboy69 oldboy 08:51:18]# grep "o*" test01.txt
gd
god
good
goood
gooood
6>在文件中找出不以字母数字结尾的文件行
[root@shiyi bonian02 20:47:53]# grep "[^0-9a-zA-Z]$" bonian.txt
m oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
2. 三剑客命令grep
概述:
命令用于查找文件里符合条件的字符串
语法格式:
grep [参数] ‘条件 ’ 文件
重要参数总结:
-i --- 忽略大小写搜索信息
-n --- 搜索信息后显示行号
-c --- 统计筛选出来的行数
-v --- 将搜索信息进行取反
-o --- 只输出显示匹配信息
-w --- 按照字符串进行匹配
-A --- 过滤指定内容之后的信息
-B --- 过滤指定内容之前的信息
-C --- 过滤指定内容上下几行的信息
-D --- 设置对设备,FIFO,管道的操作,读取,跳过
-F --- 一个换行符分隔的字符串的集合fgrep
-G --- 基本正则
-E --- 识别扩展正则信息
-e --- 指定字符串做为查找文件内容
-r --- 递归搜索指定数据信息
-d --- 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作
-s --- 不显示错误信息
-q --- 不显示任何信息
-l --- 列出文件内容符合指定的样式的文件名称
-L --- 列出文件内容不符合指定的样式的文件名称
-y --- 此参数的效果和指定"-i"参数相同
-H --- 在显示符合样式的那一行之前,显示该行所属的文件名称
-h --- 在显示符合样式的那一行之前,不显示该行所属的文件名称
-P --- 调用的perl正则
-f --- 从文件中获得匹配模式
-x --- 匹配整行
-z --- 一个0字节的数据行,但不是空行
-m --- 匹配的最大数
-b --- 打印匹配行前面打印该行所在的块号码。
-a --- 匹配二进制的东西
-I --- 不匹配二进制的东西
-d --- 目录操作,读取,递归,跳过
-R --- 递归调用
-Z --- 在FILE 文件最后打印空字符
-U --- 使用标志高亮匹配字串;
-u --- 当CR 字符不存在,报告字节偏移(MSDOS 模式)
实战演练:
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
结果如下所示:
$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,
并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
输出结果如下:
$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”
#下包含“update”的文件
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)
Rather than
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of
IO.) Rather than
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
3、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test *test*
结果如下所示:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行
testfile1:helLinux!
testfile1:Linis a free Unix-type operating system.
testfile1:Lin
testfile_1:HELLO LINUX!
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
testfile_1:THIS IS A LINUX TESTFILE!
testfile_2:HELLO LINUX!
testfile_2:Linux is a free unix-type opterating system
4. 场景: 系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)
grep -n '2019-10-24 00:01:11' *.log
查看符合条件的日志条目。
free-coder
free-coder
5. Linux 里利用 grep 和 find 命令查找文件内容
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep "thermcontact" /.in
从文件内容查找与正则表达式匹配的行:
$ grep –e "正则表达式" 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:
$ find / -type f -name "*.log" | xargs grep "ERROR"
例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
find . -name "*.in" | xargs grep "thermcontact"
在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
grep match_pattern file_name
grep "match_pattern" file_name
在多个文件中查找:
grep "match_pattern" file_1 file_2 file_3 ...
输出除之外的所有行 -v 选项:
grep -v "match_pattern" file_name
标记匹配颜色 --color=auto 选项:
grep "match_pattern" file_name --color=auto
使用正则表达式 -E 选项:
grep -E "[1-9]+"
或
egrep "[1-9]+"
只输出文件中匹配到的部分 -o 选项:
echo this is a test line. | grep -o -E "[a-z]+\."
line.
echo this is a test line. | egrep -o "[a-z]+\."
line.
统计文件或者文本中包含匹配字符串的行数 -c 选项:
grep -c "text" file_name
输出包含匹配字符串的行数 -n 选项:
grep "text" -n file_name
或
cat file_name | grep "text" -n
#多个文件
grep "text" -n file_1 file_2
打印样式匹配所位于的字符或字节偏移:
echo gun is not unix | grep -b -o "not"
7:not
#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。
搜索多个文件并查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...
grep递归搜索文件
在多级目录中对文本进行递归搜索:
grep "text" . -r -n
# .表示当前目录。
忽略匹配样式中的字符大小写:
echo "hello world" | grep -i "HELLO"
hello
选项 -e 制动多个匹配样式:
echo this is a text line | grep -e "is" -e "line" -o
is
line
#也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
在grep搜索结果中包括或者排除指定文件:
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
使用0值字节后缀的grep与xargs:
#测试文件:
echo "aaa" > file1
echo "bbb" > file2
echo "aaa" > file3
grep "aaa" file* -lZ | xargs -0 rm
#执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0
读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
grep静默输出:
grep -q "test" filename
#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。
打印出匹配文本之前或者之后的行:
#显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3
5
6
7
8
#显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3
2
3
4
5
#显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3
2
3
4
5
6
7
8
#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
a
b
--
a
b
3. 三剑客命令sed
sed作用:
1)可以查找过滤筛选出指定的信息
2)擅长编辑文件内容信息
3)擅长对文件行进行操作
语法格式:
sed [参数] '条件 指令' 文件信息
参数:
-n --- 取消模式输出
-i --- 真正编辑文件内容
-r --- 识别扩展正则
-e --- 识别多个条件操作
-f --- 直接将 sed 的动作写在一个文件内,-f filename 则可以运行filename 内的
sed动作指令
p --- 输出操作
d --- 删除操作
a --- 附加操作
i --- 插入操作
c --- 取代操作:c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
s --- 替换操作
g --- 全局替换
w --- 表示把行写入一个文件。
x --- 表示互换模板块中的文本和缓冲区中的文本。
y --- 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 --- 子串匹配标记
& --- 已匹配字符串标记
a\ --- 在当前行下面插入文本。
i\ --- 在当前行上面插入文本。
c\ --- 把选定的行改为新的文本。
D --- 删除模板块的第一行。
h --- 拷贝模板块的内容到内存中的缓冲区。
H --- 追加模板块的内容到内存中的缓冲区。
G --- 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l --- 列表不能打印字符的清单。
N --- 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
P --- 打印模板块的第一行。
q --- 退出Sed。
b --- 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
t --- if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T --- 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w --- 写并追加模板块到file末尾。
W --- 写并追加模板块的第一行到file末尾。
使用方法:
熟悉sed命令查询操作:
(1)根据行号进行查询:
单行查询:sed -n '3p' 文件
连续多行查询:sed -n '1,3p' 文件
sed -n '2,$p' 文件
不连续多行查询:sed -n '1p;3p;5p' 文件
(2)根据字符进行查询:
单行查询:sed -n '/字符信息/p' 文件
连续多行查询:sed -n '/字符信息1/,/字符信息2/p' 文件
不连续多行查询:sed -n '/字符信息1/p;/字符信息2/p;/字符信息3/p' 文件
熟悉sed命令增添操作:a--在某一行或几行的下一行添加
i--在某一行或几行的上一行添加
$--在文件最后一行后添加信息
(1)根据行号进行增添:
单行增添:sed '1a信息' 文件
连续多行增添:sed '1,3a信息' 文件
不连续多行增添:sed -e '1a信息' -e '3a信息' -e '5a信息' 文件
(2)根据字符进行增添:
单行增添:sed '/字符信息/a信息' 文件
连续多行增添:sed '/字符信息/,/字符信息/a信息' 文件
不连续多行增添:sed -e '/字符信息/a信息' -e '/字符信息/a信息' -e '/字符信息/a信息' 文件
熟悉sed命令删除操作: 不加参数就不会真正删除,真正删除加参数-i
-i ---将模式空间内容覆盖到block中进行删除
(1)根据行号进行删除:
单行删除:sed '6d' 文件
连续多行删除:sed '6,9d' 文件
不连续多行删除:sed '6p;9p' 文件
(2)根据字符进行删除:
单行删除:sed '/字符信息/d' 文件
连续多行删除:sed '/字符信息1/,/字符信息2/d' 文件
不连续多行删除:sed '/字符信息1/d;/字符信息2/d;/字符信息3/d' 文件
熟悉sed命令修改操作:
(1)根据行号进行修改:
单行修改:sed '3s#文件内需要修改的内容#修改完后的内容#g' 文件
连续多行修改:sed '2,4s#文件内需要修改的内容#修改完后的内容#g' 文件
(2)根据字符进行修改:
单行修改:sed '/字符信息/s#文件内需要修改的内容#修改完后的内容#g' 文件
连续多行修改:sed '/字符信息/,/字符信息/s#文件内需要修改的内容#修改完后的内容#g' 文件
实战演练:
//test.txt 内容如下
11 aa
22 bb
33 cc
23 dd
55 2e
删除行:
按照行号删除:
[root@shiyi bonian02 16:59:30]# sed '1d' test.txt
22 bb
33 cc
23 dd
55 2e
[root@shiyi bonian02 16:59:30]# sed '2,5d' test.txt 删除带字符‘2’的行
11 aa
55 2e
[root@shiyi bonian02 16:59:30]# sed '2d,4d' test.txt 删除以字符‘2’开头的行
11 aa
33 cc
55 2e
按照字符删除:
[root@shiyi bonian02 16:59:30]# sed '/11 aa/d' test.txt
22 bb
33 cc
23 dd
55 2e
[root@shiyi bonian02 16:59:30]# sed '/22 bb/,/55 2e/d' test.txt 删除带字符‘2’的行
11 aa
55 2e
[root@shiyi bonian02 16:59:30]# sed '/22 bb/d,/23 dd/d' test.txt 删除以字符‘2’开头的行
11 aa
33 cc
55 2e
新增行:
按照行号增加:a--在某一行或几行的下一行添加 i--在某一行或几行的上一行添加
[root@shiyi bonian02 16:59:30]# sed '1a hello world' test.txt
11 aa
hello world
22 bb
33 cc
23 dd
55 2e
[root@shiyi bonian02 16:59:30]# sed '1i hello world' test.txt
hello world
11 aa
22 bb
33 cc
23 dd
55 2e
按照字符增加:
[root@shiyi bonian02 16:59:30]# sed '/11 aa/a hello world' test.txt
11 aa
hello world
22 bb
33 cc
23 dd
55 2e
[root@shiyi bonian02 16:59:30]# sed '/11 aa/i hello world' test.txt
hello world
11 aa
22 bb
33 cc
23 dd
55 2e
替换行
按照行号替换:
[root@shiyi bonian02 16:59:30]# sed '1c hello world' test.txt
hello world
22 bb
33 cc
23 dd
55 2e
[root@shiyi bonian02 16:59:30]# sed '2,4c hello world' test.txt
11 aa
hello world
33 cc
hello world
55 2e
按照字符替换:
[root@shiyi bonian02 16:59:30]# sed '/11 aa/c hello world' test.txt
hello world
22 bb
33 cc
23 dd
55 2e
[root@shiyi bonian02 16:59:30]# sed '/22 bb/c,/23 dd/c hello world' test.txt
11 aa
hello world
33 cc
hello world
55 2e
替换部分内容
[root@shiyi bonian02 16:59:30]# sed 's#aa#AA#g' test.txt
11 AA
22 bb
33 cc
23 dd
55 2e
s#需要替换的内容信息#替换后的内容信息#(g)
当不加上"g"时只会将字符串开头的进行替换
而加上"g"时会进行全局替换
PPS:当然表示分隔的不止#,还有/,@等
==========================================================================
为了更好地体现 s#需要替换的内容信息#替换后的内容信息#(g) 的效果,将文件内容进行增添:
//test.txt
11 aa
22 bb
33 cc
23 dd
55 2e
66 aaff ccaa
zz ggaa
==========================================================================
[root@shiyi bonian02 16:59:30]# sed 's#aa#AA#' test.txt
11 AA
22 bb
33 cc
23 dd
55 2e
66 AAff ccaa
zz ggAA
[root@shiyi bonian02 16:59:30]# sed 's#aa#AA#g' test.txt
11 AA
22 bb
33 cc
23 dd
55 2e
66 AAff ccAA
zz ggAA
替换指定行的内容:
[root@shiyi bonian02 16:59:30]# sed '1s#aa#AA#g' test.txt
11 AA
22 bb
33 cc
23 dd
55 2e
66 aaff ccaa
zz ggaa
[root@shiyi bonian02 16:59:30]# sed '5,$s#aa#AA#g' test.txt
11 aa
22 bb
33 cc
23 dd
55 2e
66 AAff ccAA
zz ggAA
[root@shiyi bonian02 16:59:30]# sed '/^[0-9]/s#aa#AA#g' test.txt
11 AA
22 bb
33 cc
23 dd
55 2e
66 AAff ccAA
zz ggaa
==========================================================================
为了更直观的表示查询效果,更改文件内容如下:
//test.txt
11 aa
22 bb
33 cc
23 dd
==========================================================================
[root@shiyi bonian02 16:59:30]# sed '2p' test.txt
11 aa
22 bb
22 bb
33 cc
23 dd
可以看到第二行被输出来了,但是将文件的所有内容输出了一遍,且第2行则多输出了一次
这是因为文件内容默认输出了,可以用-n取消默认输出
[root@shiyi bonian02 16:59:30]# sed -n '2p' test.txt
22 bb
[root@shiyi bonian02 16:59:30]# sed -i '2d' test.txt
加上-i参数在运行命令之后,我们发现test.txt的第2行没有了,因为不论是删除,替换,添加都是在内容中进行,不会对磁盘内容有任何影响,
加上-i参数后,会将内存的内容对磁盘内容进行覆盖从而真正改变文件内容
4. 三剑客命令awk
1) 三剑客awk命令概述介绍:
awk - pattern scanning and processing language
模式扫描(处理文件每一行信息) 过程语言(一门脚本语言 逻辑语句(循环/判断))
作用说明:
1) 擅长对文件列进行操作
2) 擅长统计分析数据信息
2) 三剑客awk命令执行原理:
3) 三剑客awk命令语法结构:
awk [参数] '模式{动作信息}' 文件信息
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
使用方法:
参数: -F 指定列分隔
-v 在awk程序开始之前指定一个值valu给变量var,这些变量值用于awk程序的BEGIN快
-f 后面跟一个保存了awk程序的文件,代替在命令行指定awk程序
动作信息:print:参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分
printf:其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂
gsub: awk替换信息方法:
gsub(/替换的信息/,"要替换成什么",$n替换的第几列信息)
模式信息:BEGIN 用于初始化FS变量(列分隔符),打印标题,或者初始化后需要在程序中调用的全局变量
END 用于执行最后的运算或者打印最终的输出结果
END块和BEGIN不是必须的
内置变量:
NR: 表示行号信息
NF: 当前行中有多少列
$NF: 当前行最后一列的内容(如果每一行有多列内容)
FS: 表示分隔符字段信息
;awk提供了多个比较操作符:"==" ">" "<" "<=" ">=" "!=" "~"匹配 "!~"不匹配
三剑客awk命令执行原理(图解):
4) 三剑客awk命令实操练习:
==========================================================================
准备环境:
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
==========================================================================
(1)awk '{print}' 文件信息 #逐行读取文件并输出到界面
[root@shiyi bonian02 20:11:05]# awk '{print}' awk.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
(2)awk '{print $n}' 文件信息 #逐列读取文件并输出第n列到界面(当n=0时,保留当前行所有内容)
[root@shiyi bonian02 20:13:39]# awk '{print $1}' awk.txt
Zhang
Zhang
Meng
Wu
Liu
Wang
Zi
Li
Lao
[root@shiyi bonian02 20:22:16]# awk '{print $0}' awk.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
(3)awk '{print "Xiaoyu"}' 文件信息 #逐行读取文件,每行结束后打印一次Xiaoyu,文件有多少行就打印多少个Xiaoyu
[root@shiyi bonian02 20:19:59]# awk '{print "Xiaoyu"}' awk.txt
Xiaoyu
Xiaoyu
Xiaoyu
Xiaoyu
Xiaoyu
Xiaoyu
Xiaoyu
Xiaoyu
Xiaoyu
(4)awk -F ":" '{print $1}' 文件 #以":"为分隔符打印文件的第一例内容
[root@shiyi bonian02 20:28:51]# awk -F ":" '{print $1}' awk.txt
Zhang Dandan 41117397
Zhang Xiaoyu 390320151
Meng Feixue 80042789
Wu Waiwai 70271111
Liu Bingbing 41117483
Wang Xiaoai 3515064655
Zi Gege 1986787350
Li Youjiu 918391635
Lao Nanhai 918391635
(5)awk '/Xiaoyu/{print}' 文件 #打印文件中匹配Xiaoyu的那一行内容
[root@shiyi bonian02 20:29:09]# awk '/Xiaoyu/{print}' awk.txt
Zhang Xiaoyu 390320151 :155:90:201
(6)awk -F ":" '/Xiaoyu/{print $3}' 文件 #以":"为分隔符打印文件中匹配Xiaoyu的那一行中的第三列的内容
[root@shiyi bonian02 20:38:33]# awk -F ":" '/Xiaoyu/{print $3}' awk.txt
90
(7)awk '$2~/Xiaoyu/{print $3}' 文件 #打印文件中,第二列匹配Xiaoyu的行其第三列的内容 ~表示匹配(以空格为分隔符)
[root@shiyi bonian02 11:36:25]# awk '$2~/Xiaoyu/{print $3}' awk.txt
390320151
(8)awk -F ":" '$1~/Xiaoyu/{print $3}' 文件 #打印文件中,第一列匹配Xiaoyu的行其第三列的内容 ~表示匹配(以":"为分隔符)
[root@shiyi bonian02 11:20:25]# awk -F ":" '$1~/Xiaoyu/{print $3}' awk.txt
90
(9)awk 'BEGIN {FS=":"} {if ($1~/Xiaoyu/) {print $2}}' 文件 # 以":"为分隔符,打印文件中第一列匹配Xiaoyu的行,其第二列的内容
[root@shiyi bonian02 11:40:23]# awk 'BEGIN {FS=":"} {if ($1~/Xiaoyu/) {print $2}}' awk.txt
155
(10)awk 'BEGIN {FS=":"} ($1~/Xiaoyu/ || $2~/175/) {print $3}' 文件# 以":"为分隔符,打印文件中,第一列匹配Xiaoyu或者第二列匹配175的行,其第三列的内容
[root@shiyi bonian02 13:57:13]# awk 'BEGIN {FS=":"} ($1~/Xiaoyu/ || $2~/175/) {print $3}' awk.txt
90
75
(11)awk '/111/{print NF}'' 文件 # 统计匹配ock的行有多少列
[root@shiyi bonian02 16:55:33]# awk '/111/{print NF}' awk.txt
4
5
4
(12)awk 'NF == 5 {print}' 文件 #打印文件中有5列的行的内容,示例中,第四行有五列,所以打印的就是第四行的内容
[root@shiyi bonian02 17:12:16]# cat awk.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75 Xiaoai
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@shiyi bonian02 17:15:43]# awk 'NF==5 {print}' awk.txt
Wu Waiwai 70271111 :250:80:75 Xiaoai
(13)awk '{if (NR > 3) {print $NF} }' 文件 # 输出文件中行号大于3的行,其最后一列的内容
[root@shiyi bonian02 17:15:51]# awk '{if (NR > 3) {print $NF} }' awk.txt
Xiaoai
:250:100:175
:50:95:135
:250:168:200
:175:75:300
:250:100:175
(14)awk '{if (NR > 8) {print NR".\t"$0} }' 文件 #格式化输入文件中行号大于3的行的行号和内容
[root@shiyi bonian02 17:17:51]# awk '{if (NR > 8) {print NR".\t"$0} }' awk.txt
9. Lao Nanhai 918391635 :250:100:175
(15)awk 'BEGIN { x=0 } /^$/{x=x+1} END{print "find" " " x " " "blank lines"}' 文件 #统计文件中有多少空行
[root@shiyi bonian02 17:25:05]# awk 'BEGIN {x=0} /^$/{x=x+1}END{print"find" ""x"" "blank lines"}' awk.txt
find0blank lines
==========================================================================
awk脚本作用:打印文本中每一列的内容
#!/bin/bash
num=`wc 1.txt | awk '{print $2}'` # 统计1.txt文件有多少列
for i in `seq 1 $num` # 根据文件列数进行循环
do
awk -v a=$i '{print $a}' 1.txt # 打印每一列的内容,-v 参数可以指定一个变量保存外部变量的值,将外部变量传递给awk
done
==========================================================================
5) 三剑客awk命令高级功能:
普通运算:
[root@shiyi bonian02 20:09:39]# awk 'BEGIN{print 2+4}'
6
[root@shiyi bonian02 20:10:21]# awk 'BEGIN{print 2-4}'
-2
[root@shiyi bonian02 17:01:01]# awk 'BEGIN{print 2*4}'
8
[root@shiyi bonian02 20:10:07]# awk 'BEGIN{print 2^4}'
16
[root@shiyi bonian02 20:10:15]# awk 'BEGIN{print 2%4}'
2
[root@shiyi bonian02 20:10:15]# awk '{print ($2**2) +1}' 文件
#将文件中第二列内容做平方运算后再加1输入(字符串做平方运算后结果为0)
统计分析数据信息:
累加公式: i=i+1 ---(等同于)---> i++
[root@shiyi bonian02 20:10:15]# cat test13.txt
oldboy
oldgirl
oldboy
olddog
oldboy
oldbaby
在文件中逐行读取,并‘oldboy’信息出现的次数(显示过程)
[root@shiyi bonian02 20:10:15]# awk '/oldboy/{i=i+1;print i} test13.txt
1
2
3
在文件中逐行读取,只输出次数结果(不显示过程)
[root@shiyi bonian02 20:10:15]# awk '/oldboy/{i=i+1}END{print i}' test13.txt
3
求和运算/累加运算:
求和公式: i=i+$n $n 需要将第几列做求和运算
[root@shiyi bonian02 20:10:15]#cat test14.txt
1
2
3
4
5
6
7
8
9
10
[root@shiyi bonian02 20:10:15]# awk '{i=i+$1;print i}' test14.txt
1
3
6
10
15
21
28
36
45
55
[root@shiyi bonian02 20:10:15]# awk '{i=i+$1}END{print i}' test14.txt
55