制作网站公司选 择乐云seo,有没有做网站的软件,国内怎么打开WordPress网站,电子商务网站模板 html【BASH】回顾与知识点梳理 十一 十一. 八至十章知识点总结及练习11.1 总结11.2 练习情境模拟题一#xff1a;透过 grep 搜寻特殊字符串#xff0c;并配合数据流重导向来处理大量的文件搜寻问题。情境模拟题二#xff1a;使用管线命令配合正规表示法建立新指令与新变量。 该系… 【BASH】回顾与知识点梳理 十一 十一. 八至十章知识点总结及练习11.1 总结11.2 练习情境模拟题一透过 grep 搜寻特殊字符串并配合数据流重导向来处理大量的文件搜寻问题。情境模拟题二使用管线命令配合正规表示法建立新指令与新变量。 该系列目录 -- 【BASH】回顾与知识点梳理目录
十一. 八至十章知识点总结及练习
11.1 总结
正规表示法就是处理字符串的方法他是以行为单位来进行字符串的处理行为正规表示法透过一些特殊符号的辅助可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程 序grep,sed nd,sed nc string只要工具程序支持正规表示法那么该工具程序就可以用来作为正规表示法的字符串处理之用(grep sed)正规表示法与通配符是完全不一样的东西通配符 (wildcard) 代表的是 bash 操作接口的一个功能 但正规表示法则是一种字符串处理的表示方式使用 grep 或其他工具进行正规表示法的字符串比对时因为编码的问题会有不同的状态因此 你最好将 LANG 等变量设定为 C 或者是 en 等英文语系grep 与 egrep 在正规表示法里面是很常见的两支程序其中 egrep 支持更严谨的正规表示法的语法grep -e由于编码系统的不同不同的语系 (LANG) 会造成正规表示法撷取资料的差异。因此可利用特殊符号如[:upper:] 来替代编码范围较佳由于严谨度的不同正规表示法之上还有更严谨的延伸正规表示法基础正规表示法的特殊字符有 *, ., [], [-], [^], ^, $ 等扩展正则表达式特殊字符有, ?, |, (), ()常见的支持正规表示法的工具软件有 grep , sed, vim 等等printf 可以透过一些特殊符号来将数据进行格式化输出(s,i,f \t \n \v)awk 可以使用『字段』为依据进行数据的重新整理与输出($1 $2… NF,NL,FS,if-else)文件的比对中可利用 diff 及 cmp 进行比对其中 diff 主要用在纯文本文件方面的新旧版本比对 (diff -Naur)patch 指令可以将旧版数据更新到新版 (主要亦由 diff 建立 patch 的补丁来源文件) (-p0, -R)
11.2 练习
情境模拟题一透过 grep 搜寻特殊字符串并配合数据流重导向来处理大量的文件搜寻问题。
目标正确的使用正规表示法前提需要了解数据流重导向以及透过子指令 $(command) 来处理档名的搜寻
我们简单的以搜寻星号 (*) 来处理底下的任务
利用正规表示法找出系统中含有某些特殊关键词的文件举例来说找出在 /etc 底下含有星号 (*) 的文件与内容
解决的方法必须要搭配通配符但是星号本身就是正规表示法的字符因此需要如此进行名称带*的文件没有用.代替举例
[rootnode-135 passwd]# grep \* /etc/* 2/dev/null
Binary file /etc/aliases.db matches
/etc/bashrc: xterm*|vte*)
/etc/bashrc: PROMPT_COMMANDprintf \033]0;%s%s:%s\007 ${USER} ${HOSTNAME%%.*} ${PWD/#$HOME/~}
/etc/bashrc: screen*)
/etc/bashrc: PROMPT_COMMANDprintf \033k%s%s:%s\033\\ ${USER} ${HOSTNAME%%.*} ${PWD/#$HOME/~}
/etc/bashrc: *)
...你必须要注意的是在单引号内的星号是正规表示法的字符但我们要找的是星号因此需要加上跳脱字符 (\)。但是在 /etc/* 的那个 * 则是 bash 的通配符 代表的是文件的档名喔不过由上述的这个结果中我们仅能找到 /etc 底下第一层子目录的数据无法找到次目录的数据 如果想要连同完整的 /etc 次目录数据就得要这样做
grep \* $(find /etc -type f ) 2 /dev/null
[rootnode-135 passwd]# find /etc -type f|wc -l
1768
# 如果只想列出档名而不要列出内容的话使用底下的方式来处理即可喔
[dmtsaistudy ~]$ grep -l \* $(find /etc -type f ) 2 /dev/null但如果文件数量太多呢如同上述的案例如果要找的是全系统 (/) 呢你可以这样做
grep \* $(find / -type f 2 /dev/null )
-bash: /usr/bin/grep: Argument list too long真要命由于指令列的内容长度是有限制的因此当搜寻的对象是整个系统时上述的指令会发生错误。那该如何是好 此时我们可以透过管线命令以及 xargs 来处理。举例来说让 grep 每次仅能处理 10 个档名此时你可以这样想
a. 先用 find 去找出文件
b. 用 xargs 将这些文件每次丢 10 个给 grep 来作为参数处理
c. grep 实际开始搜寻文件内容。所以整个作法就会变成这样
find / -type f 2 /dev/null | xargs -n 10 grep \*从输出的结果来看数据量实在非常庞大那如果我只是想要知道檔名而已呢你可以透过 grep 的功能来找到如下的参数 find / -type f 2 /dev/null | xargs -n 10 grep -l \*情境模拟题二使用管线命令配合正规表示法建立新指令与新变量。
我想要建立一个新的指令名为 myip 这个指令能够将我系统的 IP 捉出来显示。而我想要有个新变量变量名为 MYIP 这个变量可以记录我的 IP 。
我们可以这样试看看
首先我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP 指令为
[rootnode-135 passwd]# ifconfig |grep inet.*netmask|sed -e s/^.*inet //g -e s/ net.*$//g
192.168.81.106
192.168.17.135
127.0.0.1再来我们可以将此指令利用 alias 指定为 myip 喔如下所示
[rootnode-135 passwd]# alias myipifconfig |grep inet.*netmask|sed -e s/^.*inet //g -e s/ net.*$//g最终我们可以透过变量设定来处理 MYIP 喔
[rootnode-135 passwd]# MYIP$(myip)
[rootnode-135 passwd]# echo $MYIP
192.168.81.106 192.168.17.135 127.0.0.1如果每次登入都要生效可以将 alias 与 MYIP 的设定那两行写入你的 ~/.bashrc 即可
简答题部分
我想要知道在 /etc 底下只要含有 XYZ 三个字符的任何一个字符的那一行就列出来要怎样进行
[rootnode-135 passwd]# grep [XYZ] /etc/* 2/dev/null|wc -l
687
[rootnode-135 passwd]# egrep X|Y|Z /etc/* 2/dev/null|wc -l
687将 /etc/kdump.conf 内容取出后(1)去除开头为 # 的行 (2)去除空白行 (3)取出开头为英文字母的那几行 (4)最终统计总行数该如何进行
[rootnode-135 passwd]# egrep -v ^#|^$ /etc/kdump.conf |grep ^[a-zA-Z] |wc -l
2
[rootnode-135 passwd]# egrep -v ^#|^$ /etc/kdump.conf |egrep ^[a-zA-Z].* |wc -l
2
[rootnode-135 passwd]# grep -v ^# /etc/kdump.conf | grep -v ^$ | grep ^[[:alpha:]] | wc -l
2该系列目录 -- 【BASH】回顾与知识点梳理目录