文本查看工具、grep及正则表达式

cat [OPTION]… [FILE]…顺序查看文件
-E: 显示行结束符$
-n: 对显示出的每一行进行编号(包括空白行)
-A:显示所有控制符
-T:显示制表符^I(即tab键)
-b:只对非空白行进行编号
-s:压缩连续的空行成一行

Image 001.png

tac 逆序查看文件(第一行变为最后一行)

Image 002.png

rev 行内逆序查看文件(第一个字符变为最后一个字符)

Image 003.png

more [OPTIONS…] FILE…翻页查看文件
-d: 显示翻页及退出提示
enter:向下一行
space:向下一页
q:退出
只能向下翻,无法向上翻

Image 004.png

less:一页一页地查看文件
查看时有用的命令包括:
/或?:文本搜索文本
n/N:跳到下一个或上一个匹配
space:下一页
b:上一页
q:退出
less命令是man命令使用的分页器

head [OPTION]… [FILE]…显示前几行
-c #: 指定获取前#字节
-n #或-#: 指定获取前#行,#为负值时表示不显示后#行

tail [OPTION]… [FILE]…
-c #: 指定获取后#字节
-n #或- #: 指定获取后#行,#为负值时表示不显示前(#-1)行
-f: 跟踪显示文件新追加的内容,常用日志监控

Image 005.png

cut [OPTION]… [FILE]…
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS: 按字段切割
-c FILEDS:按字符切割
FILEDS
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用:1-3,7
–output-delimiter=STRING指定输出分隔符
Image 006.png

paste [OPTION]… [FILE]…合并两个文件同行号的列到一行
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2

Image 007.png

wc 计数单词总数、行总数、字节总数和字符总数
-l:来只计数行数
-w:来只计数单词总数
-c:来只计数字节总数
-m:来只计数字符总数

sort [options] file(s)
选项
-r:反方向(由上至下)排序
-n:按数字大小排序
-f:忽略(fold)字符串中的字符大小写
-u:选项(独特,unique)删除输出中的重复行,只保留一行
-t:指定字段界定符
-k:按照使用c字符分隔的X列来整理能够使用多次

Image 008.png

uniq[OPTION]… [FILE]…从输入中删除重复的前后相接的行
-c: 显示每行重复出现的次数;
-d: 仅显示重复过的行;
-u: 仅显示不曾重复的行;
(连续且完全相同方为重复)
常和sort 命令一起配合使用:
sort userlist.txt | uniq-c

Image 009.png

diff foo.conf-broken foo.conf-works 比较两个文件之间的区别
5c5
<use_widgets=no

>use_widgets=yes
a 添加 d 删除 c 替换

diff命令的输出被保存在一种叫做“补丁”的文件中
使用-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件。
patch命令复制在其它文件中进行的改变(要谨慎使用!)
适用-b选项来自动备份改变了的文件
diff -u foo.conf-broken foo.conf-works > foo.patch
patch -b foo.conf-broken foo.patch
其中源文件更名为foo.conf-broken.orig 新文件更名为foo.conf-broken

Image 010.png

grep:文本过滤(模式:pattern)工具;grep, egrep, fgrep(不支持正则表达式搜索)
grep: Global search REgularexpression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件

grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
选项:
–color=auto: 对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息
-A #:after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-w:整行匹配整个单词
-E:使用ERE
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持:grep, vim, less,nginx等
正则表达式分两类:
基本正则表达式:BRE;扩展正则表达式:ERE
grep -E( egrep)
正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组

1.字符匹配:
. :匹配任意单个字符;
[] :匹配指定范围内的任意单个字符
[^] :匹配指定范围外的任意单个字符
[:digit:]:表示所有的数字
[:lower:]:表示所有的小写字母
[:upper:]:表示所有的大写字母
[:alpha:]:表示所有的字母(不区分大小写)
[:alnum:]:表示所有的字母和数字
[:punct:]:表示所有的标点符号
[:space:]:表示所有的空白字符

2.匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
贪婪模式:尽可能长的匹配
*:匹配前面的字符任意次,包括0次
.*:任意长度的任意字符
\?:匹配其前面的字符0或1次
\+:匹配其前面的字符至少1次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次

3.位置锚定:定位出现的位置
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$: 用于模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行
\< 或\b:词首锚定,用于单词模式的左侧
\> 或\b:词尾锚定;用于单词模式的右侧
\<PATTERN\>:匹配整个单词

4.分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
实例:\(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)

egrep= grep -E
egrep[OPTIONS] PATTERN [FILE…]
扩展正则表达式的元字符:

1.字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符

2.次数匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次

3.位置锚定:
^ :行首
$ :行尾
\<, \b :语首
\>, \b :语尾

4.分组:
()
后向引用:\1, \2, …
或者:
a|b
C|cat: C或cat
(C|c)at:Cat或cat

1、找出ifconfig命令结果中本机的所有IPv4地址
   ifconfig | head -2 | tail -1

Image 011.png

2、查出分区空间使用率的最大百分比值
   df | tail  -n +2 | cut -c 44-46

Image 012.png

3、查出用户UID最大值的用户名、UID及shell类型
   sort -nrt : -k 3 /etc/passwd | head -1 | cut -d : -f 1,3,7

Image 013.png

4、查出/tmp的权限,以数字方式显示
   stat /tmp | head -4 | tail -1 | cut -d / -f 1 | cut -d \( -f 2

Image 014.png

5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
   netstat -tn | cut -d : -f 2 | tr -s " " ":" |cut -d : -f 2 | sort | uniq -c
Image 029.pngImage 016.pngImage 029.png

1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
   grep -i '^s' /proc/meminfo
   grep  '^[S|s]' /proc/meminfo
   egrep  '^(S|s)' /proc/meminfo
   grep -e '^s' -e '^e' /proc/meminfo

Image 016.pngImage 016.png

2、显示/etc/passwd文件中不以/bin/bash结尾的行
   grep -v '/bin/bash$' /etc/passwd
   egrep -v '/bin/bash$' /etc/passwd

Image 017.png

3、显示用户rpc默认的shell程序
   getent passwd | grep -w 'rpc' | cut -d : -f 7
   getent passwd | grep '\<rpc\>' | cut -d : -f 7

Image 018.png

4、找出/etc/passwd中的两位或三位数
   grep '\<[[:digit:]]\{2,3\}\>' /etc/passwd
   grep '\<[0-9]\{2,3\}\>'' /etc/passwd

Image 019.png

5、显示/etc/grub2.cfg(centos7)文件中,至少以一个空白字符开头的且后面存非空白字符的行
   grep '^[[:space:]]\+[^[:space:]].*' /etc/grub2.cfg

Image 020.png

6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
   netstat -tan | grep 'LISTEN[[:space:]]*$'

Image 021.pngImage 021.png

7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
   grep '^\([[:alnum:]]\{1,\}\):.*\1$' /etc/passwd
Image 022.png

1、显示当前系统root、mage或wang用户的UID和默认shell
   egrep '^(root|mage|wang):' /etc/passwd | cut -d : -f 3,7

Image 023.png

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
   grep -o -E '\<[[:alnum:]]+\>\(\)' /etc/rc.d/init.d/functions

Image 024.png

3、使用egrep取出/etc/rc.d/init.d/functions中其基名
   echo '/etc/rc.d/init.d/functions' | egrep -o '[^/]+/?$'

Image 025.png

4、使用egrep取出上面路径的目录名
   echo '/etc/rc.d/init.d/functions' | egrep -o '^.*/'

Image 026.png

5、统计以root身份登录的每个远程主机IP地址的登录次数
   last | grep root | egrep -o '[[:digit:]]+.[[:digit:]]+.[[:digit:]]+.[[:digit:]]+' | uniq -c
   last | grep root | egrep -o '([[:digit:]]+.){3}[[:digit:]]+' | uniq -c
 Image 027.png

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
   [0-9]   [1-9][0-9]  1[0-9][0-9] 2[0-4][0-9] 25[0-5]

7、显示ifconfig命令结果中所有IPv4地址
   ifconfig | egrep -o '\<(1?[0-9]{0,2}|2[0-5]{0,2})(\.(1?[0-9]{0,2}|2[0-5]{0,2})){3}\>'

Image 028.png

1、用正则表达式表示IP地址
   \<(1?[0-9]{0,2}|2[0-5]{0,2})(\.(1?[0-9]{0,2}|2[0-5]{0,2})){3}\>
2、用正则表达式表示手机号
   egrep -o "^\<[3578][0-9]{9}\>"
3、用正则表达式表示身份证号码
   egrep "\<((1[1-5])|(2[1-3])|(1-7)|(4[1-6])|(5[0-4])(6[1-5])|(71|81|82)([0-9]){4}(19|20)(0-9){2((0[1-9])|1[0-2]))(0[1-9]|(0-9)|(0-9)|(3[0-1]))(0-9){3}([0-9]|X)\>"
4、用正则表达式表示邮箱
   egrep "\<([[:alnum]]+(-|_)*[[:alnum:]]*)\>@([[:lower:]]|[[:digit:]])+\.[[:lower:]]*(\.[[:lower:]])*"

原创文章,作者:anonymous,如若转载,请注明出处:http://www.178linux.com/31974