linux grep文件过滤与分割命令
文章目录
1、grep命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
选项
-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。
grep命令常见用法
在文件中搜索一个单词,命令会返回一个包含**“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
2、split命令
split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
选项
-b:值为每一输出档案的大小,单位为 byte。
-C:每一输出档中,单行的最大 byte 数。
-d:使用数字作为后缀。
-l:值为每一输出档的列数大小。
实例
生成一个大小为100KB的测试文件:
[root@localhost split]# dd if=/dev/zero bs=100k count=1 of=date.file
1+0 records in
1+0 records out
102400 bytes (102 kB) copied, 0.00043 seconds, 238 MB/s
使用split命令将上面创建的date.file文件分割成大小为10KB的小文件:
[root@localhost split]# split -b 10k date.file
[root@localhost split]# ls
date.file xaa xab xac xad xae xaf xag xah xai xaj
文件被分割成多个带有字母的后缀文件,如果想用数字后缀可使用-d参数,同时可以使用-a length来指定后缀的长度:
[root@localhost split]# split -b 10k date.file -d -a 3
[root@localhost split]# ls
date.file x000 x001 x002 x003 x004 x005 x006 x007 x008 x009
为分割后的文件指定文件名的前缀:
[root@localhost split]# split -b 10k date.file -d -a 3 split_file
[root@localhost split]# ls
date.file split_file000 split_file001 split_file002 split_file003 split_file004 split_file005 split_file006 split_file007 split_file008 split_file009
使用-l选项根据文件的行数来分割文件,例如把文件分割成每个包含10行的小文件:
split -l 10 date.file
3、look命令
look命令用于显示文件中以指定字符串开头的任意行。
语法
look(选项)(参数)
选项
-a:使用另一个字典文件web2,该文件也位于/usr/dict目录下;
-d:只对比英文字母和数字,其余一概忽略不予比对;
-f:忽略字符大小写差别;
-t<字尾字符串>:设置字尾字符串。
参数
- 字符串:指定要查找的字符串;
- 文件:指定要查找的目标文件。
4、printf命令
printf命令格式化并输出结果到标准输出。
语法
printf(选项)(参数)
--help:在线帮助;
--version:显示版本信息。
参数
- 输出格式:指定数据输出时的格式;
- 输出字符串:指定要输出的数据。
格式替代符
- %b 相对应的参数被视为含有要被处理的转义序列之字符串。
- %c ASCII字符。显示相对应参数的第一个字符
- %d, %i 十进制整数
- %e, %E, %f 浮点格式
- %g %e或%f转换,看哪一个较短,则删除结尾的零
- %G %E或%f转换,看哪一个较短,则删除结尾的零
- %o 不带正负号的八进制值
- %s 字符串
- %u 不带正负号的十进制值
- %x 不带正负号的十六进制值,使用a至f表示10至15
- %X 不带正负号的十六进制值,使用A至F表示10至15
- %% 字面意义的%
转义序列
- \a 警告字符,通常为ASCII的BEL字符
- \b 后退
- \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
- \f 换页(formfeed)
- \n 换行
- \r 回车(Carriage return)
- \t 水平制表符
- \v 垂直制表符
- \ 一个字面上的反斜杠字符
- \ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
- \0ddd 表示1到3位的八进制值字符
实例
printf "hello world"
#!/bin/bash
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
- %-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐。
- %-4.2f 格式为左对齐宽度为4,保留两位小数。
5、dump命令
dump命令用于备份ext2或者ext3文件系统。可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。
语法
dump(选项)(参数)
选项
-0123456789:备份的层级;
-b<区块大小>:指定区块的大小,单位为KB;
-B<区块数目>:指定备份卷册的区块数目;
-c:修改备份磁带预设的密度与容量;
-d<密度>:设置磁带的密度。单位为BPI;
-f<设备名称>:指定备份设备;
-h<层级>:当备份层级等于或大于指定的层级时,将不备份用户标示为“nodump”的文件;
-n:当备份工作需要管理员介入时,向所有“operator”群组中的使用者发出通知;
-s<磁带长度>:备份磁带的长度,单位为英尺;
-T<日期>:指定备份的时间与日期;
-u:备份完毕后,在/etc/dumpdates中记录备份的文件系统、层级、日期与时间等;
-w:与-W类似,但仅显示需要备份的文件;
-W:显示需要备份的文件及其最后一次备份的层级、时间与日期。
参数
备份源:指定要备份的文件、目录或者文件系统。
实例
将/home目录所有内容备份到/tmp/homeback.bak文件中,备份层级为0并在/etc/dumpdates中记录相关信息:
dump -0u -f /tmp/homeback.bak /home
将/home目录所有内容备份到/tmp/homeback.bak文件中,备份层级为1(只备份上次使用层次0备份后发生过改变的数据)并在/etc/dumpdates中记录相关信息:
dump -1u -f /tmp/homeback.bak /home
通过dump命令的备份层级,可实现完整+增量备份、完整+差异备份,在配合crontab可以实现无人值守备份。
本文介绍了Linux中grep命令的使用,包括文件过滤、递归搜索、正则表达式等;split命令的文件分割操作,如按大小、按行数分割;以及look、printf和dump命令的基础用法。

414

被折叠的 条评论
为什么被折叠?



