1. 文件查找命令
1.1 find命令
语法格式:find 搜索路径 [选项] 搜索内容
选项 | 解析 |
---|---|
-name | 按照文件名搜索 |
-iname | 按照文件名搜索,不区分文件名大小 |
-inum | 按照 inode 号搜索 |
-type | 根据文件类型(f:文件,d:目录,c:字符设备文件,b:块设备文件,l:链接文件,p:管道文件)搜索 |
-size | 根据文件大小(单位:ckMGTP)搜索,- 小于,+ 大于,例如查找/etc目录下大于1M的文件:find /etc -size +1M |
-mtime | 根据修改时间(单位:smhdw)搜索 |
-ctime | 根据创建时间(单位:smhdw)搜索 |
-atime | 根据被访问时的时间间隔(单位:smhdw)搜索 |
-mmin | n分钟以(-n:内,+n:外)内修改的文件 |
-mindepth | 从n级子目录开始搜索,最多搜索到n-1级子目录 |
-depth | 检索深度为 n 的文件,即位于指定目录以下 n 层的文件 |
-empty | 检索空文件或空目录 |
-perm | 根据文件权限搜索 |
-ls | 打印搜索到的文件的详细信息 |
-delete | 删除检索到的文件 |
-exec | 对搜索的文件常用操作(“-exec”和”-ok”相似,对文件执行特定的操作,”-ok”得到确认命令后,才会执行;-print打印输出) |
1.2 locate命令
locate
命令,不同于find命令是在整块磁盘中搜索,locate命令是在数据库文件中查找- find是默认全局匹配,locate则是默认部分匹配
- 文件更新后,用updatedb命令把文件更新到数据库(默认是第二天系统才会自动更新到数据库),否则locate查找不到
1.3 whereis命令
whereis
命令,只能用于程序名的搜索- 命令参数:二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
1.4 which命令
which
命令,仅查找二进制程序文件
2. Linux文本处理三剑客
文本处理三剑客工具grep
,sed
和awk
都是基于行处理的,它们会一行行读入数据,处理完一行之后再处理下一行。
2.1 文件处理三剑客之grep
grep
命令,用于查找文件里符合条件的字符串。
- 语法格式:
- 语法1:
grep [option] [ pattern] [file1, file2..]
- 语法2:
command | grep [option] [pattern]
- 语法1:
选项(option) | 解析 |
---|---|
-v | 不显示匹配行信息 |
-i | 搜索时忽略大小写 |
-n | 显示行号 |
-r | 递归搜索 |
-E | 支持扩展正则表达式 |
-F | 不按正则表达式匹配,按照字符串字面意思匹配 |
-c | 只显示匹配行总数 |
-w | 匹配整词 |
-x | 匹配整行 |
-l | 只显示文件名,不显示内容 |
-s | 不显示错误信息 |
grep
和egrep
grep
默认不支持扩展正则表达式,只支持基础正则表达式- 使用
grep-E
可以支持扩展正则表达式使用 egrep
可以支持扩展正则表达式,与grep-E
等价
2.2 文件处理三剑客之sed
sed
(Stream Editor),流编辑器。对标准输出或文件逐行进行处理
- 语法格式:
- 语法1:
stdout |sed [option] "pattern command"
- 语法2:
sed [option] "pattern command" file
- 语法1:
2.2.1 sed选项
选项(option) | 解析 |
---|---|
-n | 只打印模式匹配行 |
-e | 直接在命令行进行sed编辑,默认选项 |
-f | 编辑动作保存在文件中,指定文件执行 |
-r | 支持扩展正则表达式 |
-i | 直接修改文件内容 |
2.2.2 sed匹配模式
匹配模式(pattern) | 解析 |
---|---|
10command | 匹配到第10行 |
10,20command | 匹配从第10行开始,到第20行结束10, |
10,+5command | 匹配从第10行开始,到第16行结束 |
/pattern1/command | 匹配到pattern1的行 |
/pattern1/,/pattern2/command | 匹配到pattern1的行开始,到匹配到patern2的行结束 |
10,/pattern1/command | 匹配从第10行开始,到匹配到pettern1的行结束 |
/pattern1/,10command | 匹配到pattern1的行开始,到第10行匹配结束 |
1 | 打印test.txt文件的第17行 |
2.2.3 sed中的编辑命令
编辑命令 | 类别 | 含义 |
---|---|---|
p | 查询 | 打印 |
= | 查询 | 只显示行号 |
a | 增加 | 行后追加 |
i | 增加 | 行前追加 |
r | 增加 | 外部文件读入,行后追加 |
w | 增加 | 匹配行写入外部文件 |
d | 删除 | 删除 |
s/old/new | 修改 | 将行内第一个old替换为new |
s/old/new/g | 修改 | 将行内全部的old替换为new |
s/old/new/2g | 修改 | 将行内从第2个old开始到剩下所有的old替换为new |
s/old/new/ig | 修改 | 将行内全部的old替换为new,忽略大小写 |
反向引用
1 | [cmuser@localhost test]$ cat abc.txt |
&
和\1
引用模式匹配到的整个串- 两者区别在于只能表示匹配到的完整字符串,只能引用整个字符串;而
\1
可以使用()
匹配到的字符
- 两者区别在于只能表示匹配到的完整字符串,只能引用整个字符串;而
sed中引用变量时注意事项:
- 匹配模式中存在变量,则建议使用双引号
- sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号
1 | [cmuser@localhost test]$ old_str=First |
2.2.4 sed实例
- sed查找文件内容(处理一个MySQL配置文件my.cnf的文本,示例如下;编写脚本实现以下功能:输出文件有几个段,并且针对每个段可以统计配置参数总个数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[jenkins@caimeidev1 test]$ vim test1.sh
!/bin/bash
FILE_NAME=/etc/my.cnf
function get_all_segments {
echo "`sed -n '/\[.*\]/p' $FILE_NAME |sed -e 's/\[//g' -e 's/\]//g'`"
}
function count_items_in_segment {
echo "`sed -n '/\['$1'\]/,/\[.*\]/p' $FILE_NAME | grep -v ^# |grep -v ^$ |grep -v "\[.*\]" |wc -l `"
}
num=0
for seg in `get_all_segments`
do
num=`expr $num + 1`
items_count=`count_items_in_segment $seg`
echo "$num:$seg $items_count"
done
输出结果:
1 | [jenkins@caimeidev1 test]$ ./test1.sh |
- sed删除和修改文件内容
1 | 删除文件中的所有注释行和空行 |
- sed追加文件内容(a:在匹配行后面追加,i:在匹配行前面追加,r:将文件内容追加到匹配行后面,w:将匹配行写入指定文件)
1 | a:在匹配行后面追加 |
2.3 文件处理三剑客之awk
awk
是一个文本处理工具,通常用于处理数据并生成结果报告
1 | awk 'BEGIN{} pattern{commands}END{}' file_name |
语法格式 | 解析 |
---|---|
BEGIN{} | 正式处理数据之前执行 |
pattern | 匹配模式 |
{commands} | 处理命令,可能多行 |
END{} | 处理完所有匹配数据后执行 |
2.3.1 awk内置变量
内置变量 | 解析 |
---|---|
$0 | 打印行所有信息 |
$1~$n | 打印行的第1到n个字段的信息 |
NF | Number Field 处理行的字段个数 |
NR | Number Row 处理行的行号,从1开始计数 |
FNR | File Number Row 多文件处理时,每个文件单独记录行号,都是从0康凯斯 |
FS | Field Separator 字段分割符,不指定时默认以空格或tab键分割 |
RS | Row Separator 行分隔符,不指定时以回车分割\n |
OFS | Output Filed Separator 输出字段分隔符。 |
ORS | Output Row Separator 输出行分隔符 |
FILENAME | 处理文件的文件名 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
1 | [cmuser@localhost test]$ awk '{print $0}' abc.txt |
2.3.2 awk格式化输出之printf
格式符 | 解析 |
---|---|
%s | 打印字符串 |
%d | 打印10进制数 |
%f | 打印浮点数 |
%x | 打印16进制数 |
%o | 打印8进制数 |
%e | 打印数字的科学计数法格式 |
%c | 打印单个字符的ASCII码 |
修饰符 | 解析 |
---|---|
- | 左对齐 |
+ | 右对齐 |
# | 显示8进制在前面加o,显示16进制在前面加0x |
1 | 1、以字符串格式打印/etc/passwd中的第7个字段,以":"作为分隔符 |
2.3.3 awk模式匹配的两种用法
awk
模式匹配:RegExp
:按正则表达式匹配关系运算匹配
:按关系运算匹配
- RegExp(正则表达式匹配)
1 | 匹配/etc/passwd文件行中含有root字符串的所有行 |
- 运算符匹配(
<
:小于,>
:大于,<=
:小于等于,>=
:大于等于,==
:等于,!=
:不等于,~
:匹配正则表达式,!~
:不匹配正则表达式)
1 | 以:为分隔符,匹配/etc/passwd文件中第3个字段小于50的所有行信息 |
- 布尔运算符匹配(
||
:或,&&
:与,!
:非)
1 | 以:为分隔符,匹配/etc/passwd文件中包含hdfs或yarn的所有行信息 |
2.3.4 awk表达式用法
运算符 | 解析 |
---|---|
+ |
加 |
/ |
除 |
% |
模 |
^ 或** |
乘方 |
++x |
在返回x变量之前,×变量加1 |
X++ |
在返回x变量之后,×变量加1 |
1 | 使用awk计算/etc/services中的空白行数量 |
2.3.5 awk动作中的条件及循环语句
1 | 以:为分隔符,只打印/etc/passwd中第3个字段的数值在50-100范围内的行信息 |
2.3.6 awk中的字符串函数
函数名 | 解析 |
---|---|
length(str) | 计算长度 |
index(str1,str2) | 返回在str1中查询到的str2的位置 |
tolower(str) | 小写转换 |
toupper(str) | 大写转换 |
split(str,arr,fs) | 分隔字符串,并保存到数组中 |
match(str,RE) | 返回正则表达式匹配到的子串的位置 |
substr(str,m,n) | 截取子串,从m个字符开始,截取n位。n若不指定,则默认截取到字符串尾 |
sub(RE,RepStr,str) | 替换查找到的第一个子串 |
gsub(RE,RepStr,str) | 替换查找到的所有子串 |
1 | 搜索字符串"I have a dream"中出现"ea"子串的位置 |
2.3.7 awk的常用选项
选项 | 解析 |
---|---|
-v | 参数传递 |
-f | 指定脚本文件 |
-F | 指定分隔符 |
-V | 查看awk的版本号 |
2.3.8 awk中数组的用法
在awk中,使用数组时,不仅可以使用1.2…n作为数组下标,也可以使用字符串作为数组下标。
1 | 打印元素: |
1 | 统计主机上所有的TCP连接状态数,按照每个TCP状态分类 |