grep,cut,wc,sort,diff,uniq,patch命令
文本处理工具: Linux上文本处理三剑客: grep,egrep,fgrep: 文本过滤工具(模式: pattern)工具; grep:基本正则表达式,-E,-F egrep:扩展正则表达式,-G,-F fgrep:不支持正则表达式, sed: stream editor,流编辑器;文本编辑工具; awk: Linux上实现为gawk,文本报告生成器(格式化文本); 正则表达式:regual expression , regexp 由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能; 分两类: 基本正则表达式:BRE 扩展正则表达式:ERE 元字符: \(hello[[:space:]]\+\)\+ grep: global search regular expression and print out the line 作用: 文本搜索工具,根据用户指定的"模式(过滤条件)" 对目标文本逐个进行匹配检查;打印匹配到的行; 模式:由正则表达式的元字符及文本符所编写出的过滤条件; 正则表达式引擎: grep [option] pattern [file] grep [option] [-e pattern | -f file] [file...] options: --color=auto: 对匹配到的文本着色后高亮显示; -i: ignorecase,忽略字符大小写; -o: 仅显示匹配到的字符本身; -v,--invert-match: 显示不能被模式匹配到的行; -E: 支持使用扩展的正则表达式元字符; -q,quiet,--slience: 静默模式,即不输出如何信息; -A # : after,在后#行 -B # : before,在前#行 -C # : context,前后各#行 基本正则表达式元字符: 字符匹配: .:匹配任意单个字符; []:匹配指定范围内的任意单个字符; [^]:匹配指定范围外的任意单个字符; 如:[:punct:],[:alpha:];[:alnum:]#文字数字字符;[:alpha:]#文字字符; 匹配次数:用在要指明其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式; *: 匹配其前面的字符任意次;0,1,多次; 例如: grep "x*y" abxy aby xxxxy .*: 匹配任意长度的任意字符; \?: 0次或1次; \+: 1次或多次; \{m\}: m次; \{m,n\}: 至少m次,至多n次; 位置锚定: ^: 行首锚定;用于模式的最左侧; $: 行尾锚定的最右侧; ^pattern$ : 用于pattern来匹配整行; ^$: 空白行; ^[[:space:]]*$: 空行或包含空白字符的行; 单词:非特殊字符组成的连续字符(字符串)都称为单词; \< 或 \b : 词首锚定;用于单词模式左侧; \> 或 \b : 词尾锚定;用于单词模式右侧; \<pattern\>: 匹配完整单词; 练习: 1. 显示/etc/passwd文件中不以/bin/bash结尾的行; [root@centos7 ~]# grep -v "/bin/bash$" /etc/passwd 2. 找出/etc/passwd文件中的两位数或三位数; [root@centos7 ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd 3. 找出/etc/rc.d/rc.sysinit或 /etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行; [root@centos7 ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 4. 找出"netstat -tan"命令的结果中以'LISTEN'后跟0,1或多个空白符结尾的行; [root@centos7 ~]# netstat -tan | grep "LISTEN[[:space:]]*$" 分组及引用: \(\):将一个或多个字符捆绑在一起,当做一个整体进行处理; 如: \(xy\)*ab Note: 分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,这些变量为; \1: 模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符; \2: 模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符; \3 ... 如: he loves his lover. he likes his lover. she likes her liker. she loves her liker. ]# grep "\(l..e\).*\1" /PATH egrep: grep -E 支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E grep [OPTIONS] PATTERN [FILE...] 选项: -i,-o,-v,-q,-G(基本正则表达式),-A,-B,-C 扩展正则表达式的元字符: 字符匹配: .:任意单个字符 []:指定任意范围内的单个字符 [^]:指定范围外的任意单个字符 次数匹配: *:其前字符任意次,即0,1或多次; ?:0次或1次,即其前字符是可有可无的; +:其前字符至少1次;1次及以上; {m}: {m,n}: {0,n} {m,} 位置锚定: ^:行首锚定 $:行尾锚定 \<,\b: \>,\b: 分组及引用: ():分组;括号的模式匹配到的字符会被记录于正则表达式引擎的俄内部变量中; 后项引用;\1,\2,... 或 a|b:a或b C|cat: C或cat (c|C)at: cat 或 Cat 练习: 1.找出/proc/meminfo文件中,所有在大小写S开头的行;至少有三种实现方式; [root@centos7 ~]# grep -E "^(s|S)" /proc/meminfo [root@centos7 ~]# grep -E "^[sS]" /proc/meminfo [root@centos7 ~]# grep "^[sS]" /proc/meminfo [root@centos7 ~]# grep -i "^s" /proc/meminfo 2.显示当前系统上root,centos或user1用户的相关信息; [root@centos7 ~]# egrep "^(root|centos|user1)\>" /etc/passwd 3.找出/etc/rc.d/init.d/functions文件中某个单词后面跟一个小括号的行; [root@centos7 ~]# grep -E "[[:alpha:]]+\(\)" /etc/rc.d/init.d/functions 4.使用echo命令输出一绝对路径,使用egrep取出基(路径); [root@centos7 ~]# echo /etc/sysconfig | egrep -o "[^/]+/?$" 5.找出ifconfig命令结果中的1-255之间的数值; [root@centos7 ~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" 6.找出ifconfig命令结果中的IP地址;(有效ip地址:1.0.0.1--223.255.255.254) [root@centos7 ~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>" 7.添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行; [root@centos7 ~]# cat /etc/passwd | egrep "^([^:]+\>).*\1$" [root@centos7 ~]# egrep "^(\<[^:]+\>).*(\1)$" /etc/passwd fgrep: 不支持正则表达式元字符; 当无需要用到元字符去编写时,使用fgrep必然更好; 文本查看及处理工具:wc ,cut ,sort ,uniq , diff,patch wc: 单词统计; wc [OPTION]... [FILE]... -l:lines行 -w:words字 -c:bytes字节 -m:chars字符数,不可与-c同用 -L:打印最长行的长度 cut: 文本截取 cut OPTION... [FILE]... -d CHAR: 以指定的字符为分隔符; -f FIELDS: 挑选出的字段; # : 指定的单个字段; #-#: 连续的多个字段; #,#: 离散的多个字段; sort: 排序 sort OPTION... [FILE]... -n:基于数值大小而非字符进行排序; -t CHAR:指定分隔符; -k#:用于排序比较的字段; -r:逆序排序; -f:忽略字符大小写 -u:重复内容只保留一次; 重复行:连续且相同; uniq: 报告或移除重复的行 uniq [OPTION]... [INPUT [OUTPUT]] -c: 统计显示每一行出现的次数; -u: 仅显示不重复的行; -d: 仅显示重复的行; diff: 比较不同 diff [option]...FILES.. diff /PATH/oldfile /PATH/newfile > /PATH/PATH_file -u: 使用unfied 机制,即显示要修改的行上下文,默认为3行; patch: 向文件打补丁 patch [option] -i /PATH/PATH_file /PATH/oldfile patch /PATH/oldfile < /PATH/PATH_file 练习: 取出ifconfig命令结果中ip地址;