CentOS 6 (74)

正则表达式的与或非

正则表达式的与或非 我们都知道,写正则表达式有点像搭积木,复杂的功能总可以拆分开来,由不同的元素(也就是子表达式)对应,再用合适的关系将它们组合起来,就可以完成。在这一节,我们讲解常见的与或非关系的表达。 与 “与”是最简单的关系,它表示若干个元素必须同时相继出现,比如匹配单词cat,其实就是要求字符c、字符a和字符t必须同时连续出现。 正则表达式表达“与”关系非常简单,直接连续写出相继出现的元素就可以,我们可以想象,在各个元素之间,存在看不见的连接操作符·,比如上面匹配单词cat的正则表达式,就是『cat』,我们可以将它想象为『c·a·t』。 “与”关系也不限于字符之间,任何子表达式都可以用它来连接,如果我们把上面单词中的a替换为字符组『[au]』,表达式就变为『c[au]t』,你可以想象为『c·[au]·t』。 或 “或”是正则表达式灵活性的重要体现,我们可以规定某个位置的文本的“多种可能”,比如要匹配cat或是cut,在正则表达式看来,就是“字符c,然后是a或u,然后是t”。 如果“或”的多种可能都是单个字符(一般要求ASCII字符,中文字符等多字节字符的情况,可以参考本书专门论述的章节,此处仅以ASCII字符为例),就可以用字符组来表达“或”的关系,比如上面的cat或者cut的情况,正则表达式写做『c[au]t』,其原理如下: 更复杂的情况是“或”的多种可能,并非都是单个字符,有些可能是多个字符。比如,我们可以看一个更复杂的例子,不仅要匹配cut,还要匹配c开头、t结尾的单词chart、conduct和court。也就是说,在开头的c,结尾的t之间“可能”出现的是:u或har或onduc或our。 遇到这种情况,就不应使用字符组,而应当使用多选分支『(…|…)』,将各个“可能选项”列在多选分支中。于是,正则表达式变为『c(u|har|onduc|our)t』,其原理如下: 关于多选分支,还有两点要补充: 多选分支也可用于“每个选择都是单个字符”的情况,比如『c[au]t』写成『c(a|u)t』是没错的,但字符组的效率要远高于多选分支,所以,在这种情况下,推荐使用字符组『c[au]t』; 默认的多选分支『(…|…)』使用的括号是会捕获文本的,也就是说,括号内的表达式真正匹配成功的文本会记录下来,匹配完成之后可以提取出来,具体到上面的例子,就是我们有办法在匹配完成后“提取”出u或har或onduc或our。但许多时候,我们需要的只是整个表达式的匹配,而不关心“匹配时到底选择的哪种可能情况”,在这种情况下,我们稍加修改,使用“不捕获文本的括号”,可以提高效率。不捕获文本的写法也很简单,只是在开扩号之后加上字符『?:』,也就是『(?:…|…)』,具体到上面的例子,就应该写成『c(?:u|har|onduc|our)t』。这样做虽然繁琐点,但效率有保障,阅读起来也不困难,我推荐养成这种习惯,只要用到了括号,就想想是否真的要捕获括号内表达式匹配的文本,如果不需要,就是用不捕获文本的括号。 非 “非”看起来简单,其实是最复杂的,以下分几种情况讨论。 首先讨论针对字符的“非”:不容许出现某个或某几个字符。这是最简单的情况,直接用排除型字符组就可以对付,仍然用上面的例子,如果要匹配的单词是c开头、t结尾,中间有一个字符,但不能是u(也就是说,整个单词不能是cut),直接用『c[^u]t』就可以了,若中间的字符不能是a或u(也就是说,整个单词不能是cat或cut),则表达式改为『c[^au]t』。 如果你认真读过关于排除型字符组的章节,肯定会知道,这个表达式能匹配的只是cot之类的单词,因为中间的排除型字符组『[^au]』必须匹配一个字符。可是,如果我们还想要匹配chart、conduct和court,怎么办?最简单的想法是去掉排除型字符组的长度限制,改成『c[^au]+t』——不幸的是,这样行不通,因为这个表达式的意思是:c和t之间,是由多于一个“除a或u之外的字符“构成的,而chart、conduct和court,都包含a或u。 我们回头仔细看看这个“非”的逻辑,我们发现,其实我们要否定的是“单个出现的a或u”,而不仅仅是“出现的a或u”,所以才出现这样的问题,要解决这个问题,就应当把意思准确表达出来,变成“在结尾的t之前,不容许只出现一个a或u”。想到这一步,我们就可以用否定顺序环视『(?!…)』来解决了,它表示“在这个位置向右,不容许出现子表达式能够匹配的文本,我们把子表达式规定为『[au]t\b』(最后的『\b』很重要,它出现在t之后,保证t是单词的结尾子母)。 有了这点限制,匹配a和t之间文本的表达式就随意很多了,我们可以用匹配单词字符的简记法『\w』表示,于是整个表达式就变成了『c(?![au]t\b)\w+t』。请注意,这里出现的并不是排除型字符组『[^au]』,而是普通的字符组『[au]』,因为否定顺序环视『(?!…)』本身已经表示了“否定”的功能。 如果我们再进一步,“整个匹配文本中都不能出现字符串cat”,要怎么办呢?许多人的思路就是借鉴处理“或”关系的思路:既然字符组对应单个字符的情况,多选分支对应多个字符的情况,那么在否定时也是这样。可惜,正则表达式并没有提供与多选分支对应的“否定”结构,那么,应该怎么办呢? 解决的办法还是得依靠否定顺序环视——“整个匹配文本中都不能出现字符串cat”,换句话说,就是“在文本中的任意位置,向右,都不能出现该字符串”。因此,我们用两个锚点『^』和『$』,分别匹配整个字符串的开头和结尾位置,再用否定顺序环视『(?!cat)』表达“不能出现字符串cat”。 即便知道了原理,也不见得能写对正则表达式,比如『^(?!cat).+$』就是不正确的,因为它只限定了在文本的开头(也就是『^』)右边不能出现cat,而我们真正要做的是,在文本的每一个位置右边,都不能出现cat,所以应该改成『^((?!cat).)+$』;但这还说不上完美,根据前面提到的关于括号捕获的知识,因为此处并不需要括号捕获的文本,所以最好使用非捕获型括号『(?:…)』,最终我们得到的表达式就是『^(?:(?!cat).)+$』。
Read more...

Grep学习笔记

1. grep简介   grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包 括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能 更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。 grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。 grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。 2. grep正则表达式元字符集(基本集)   ^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 $ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 . 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 * 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。 [] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 [^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 \(..\) 标记匹配字符,如'\(love\)',love被标记为1。 \< 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。 \> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 x\{m\} 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。 x\{m,\} 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。 x\{m,n\} 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。 \w 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 \W \w的反置形式,匹配一个或多个非单词字符,如点号句号等。 \b 单词锁定符,如: '\bgrep\b'只匹配grep。 3. 用于egrep和 grep -E的元字符扩展集   + 匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。 ? 匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。 a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed () 分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。 x{m},x{m,},x{m,n} 作用同x\{m\},x\{m,\},x\{m,n\} 4. POSIX字符类   为 了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。 [:alnum:] 文字数字字符 [:alpha:] 文字字符 [:digit:] 数字字符 [:graph:] 非空字符(非空格、控制字符) [:lower:] 小写字符 [:cntrl:] 控制字符 [:print:] 非空字符(包括空格) [:punct:] 标点符号 [:space:] 所有空白字符(新行,空格,制表符) [:upper:] 大写字符…
Read more...

awk中使用shell的环境变量

awk中使用shell的环境变量一:"'$var'"这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:var="test"awk 'BEGIN{print "'$var'"}'这种写法其实际是双括号变为单括号的常量,传递给了awk.如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:var="this is a test"awk 'BEGIN{print "'"$var"'"}'二:'"$var"'这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.三.把括起awk程序的''变为"",使用"$var"如:$var="this is a test"awk 'BEGIN{print "$var"}"这是因为在""里$是特殊字符,而在''里$是普通字符.四:export 变量,使用ENVIRON["var"]形式,如:$var="this is a test";export $varawk 'BEGIN{print ENVIRON["var"]}'五:当然也可以使用-v选项如:$var="this is a test"awk -vnvar="$var" '{print nvar}'这样便把系统变量定义成了awk变量.
Read more...

linux shell编写以日期时间为文件名的脚本

-- #!/bin/sh a=`date +%Y-%m-%d-%H-%M-%S`echo $a; a=`date +%Y-%m-%d-%Hh-%Mm-%Ss`echo $a;     #log MYDATE=`date +%d%m%y` #append MYDATE to the variable LOGFILE that holds the actual filename of the log LOGFILE=/root/test_log.$MYDATE #create the file >$LOGFILE MYTIME=`date +%d%R` LOGFILE2=/root/test_logtime.$MYTIME #create the file >$LOGFILE2 
Read more...

Linux下如果/var/log/messages停止寫入內容了,如何重新啟動syslogd .

# cd /etc/init.d # ./syslog restart Shutting down kernel logger: OK ]Shutting down system logger: OK ]Starting system logger: OK ]Starting kernel logger: OK ] 不過最好查詢清楚是為什么不能寫入linux os log的 ? -------------------------------------------------------------- 日志功能 日志(log)功能用于将路由器产生的各种信息以日志形式记录到具备syslog功能的主机上(如unix主机)。 该功能的缺省形式是将信息显示在连接console口的终端上。 一、syslog功能简介 1、unix主机用syslogd记录系统信息,信息来源包括: 1)系统内核产生系统信息 2)fifo管道记录内部进程通信的信息 3)进程将信息通过socket连接写入到log设备中 4)远端主机通过某种连接将信息输入 其中,第3项与本路由器syslog功能有关。 2、unix将系统信息以某种形式分类或分级,该形式可理解为: facility.level facility代表产生信息的来源,常用的有以下几项: auth 用户身份认证信息 authpriv 用户权限认证信息 cron cron信息 daemon daemon进程产生的信息 kern 内核信息 local0~7 系统留用 lpr 打印队列产生的信息 mail 邮件系统信息 news news系统信息 user 用户进程产生信息 uucp 与uucp有关的信息 syslog syslogd自身信息 level 是信息的级别,代表着子系统对该级别或该级别以上的信息所要采取的措施,常用的有8项 emerg 系统失效,级别最高 alert 需立即修补 crit 情况严重,如硬件损坏 err 错误 warning 警告 notice 需加以注意,但无关紧要 info 普通信息 debug debug信息 二、config状态下log的配置 logging命令有如下命令选项 buffered - 将日志记录于内部缓冲区 clear - 清除内部日志 console [ * ] - 将日志记录于终端 facility…
Read more...

find命令 — 之查找指定时间内修改过的文件

find命令 -- 之查找指定时间内修改过的文件比如我们要查找linux下指定时间内做过改动的文件,我们可以用find命令,其实find命令的功能十分强大,下面我们通过几个简单的例子来学习下find命令的简单用法: find /opt -iname "*" -atime 1 -type f找出 /opt 下一天前访问过的文件选项 OPTIONS所有的选项都总是返回真值,它们总会被执行,除非放在表达式中执行不到的地方。因此,清楚起见,最好把它们放在表达式的开头部分。 -daystart从当日起始时开始而不是从24小时之前,计算时间(for -amin, -atime, -cmin, -ctime, -mmin, and -mtime)。 -amin n对文件的最近一次访问是在 n 分钟之前。 -anewer file对文件的最近一次访问比 file 修改时间要晚。如果命令行中 -follow 在 -anewer 之前,(也只有在这种情况下 -anewer会受 -follow 的影响)。 -atime n对文件的最近一次访问是在 n*24 小时之前。 -cmin n对文件状态的最近一次修改是在 n 分钟之前。 -cnewer file对文件状态的最近一次修改比 file 修改时间要晚。如果命令行中 -follow 在 -cnewer 之前,(也只有在这种情况下-cnewer 会受 -follow 的影响)。 -ctime n对文件状态的最近一次修改是在 n*24 小时之前。 -mmin n对文件数据的最近一次修改是在 n 分钟之前。 -mtime n对文件数据的最近一次修改是在 n*24 小时之前。 -mtime : 指定时间曾被改动过的文件,意思是文件內容被更改过 -ctime : 指定时间曾被更改过的文件,意思是文件权限被更改过 -atime : 指定时间曾被存取过的文件,意思是文件被读取过1.  时间是以 24 小时为一个单位,而不是以天的2.  2011/09/08 12:00 时间开始找一天內的,会列出 2011/09/07 12:00 ~ 2011/09/08 12:00 时间內的文件 找出 3 天"以前"被改动过的文件 (前第三天以前 → 2011/09/05 12:00 以前的文件) (> 72 小时) find /var/log/ -mtime +3 -type f -print   找出 3 天內被改动过的文件…
Read more...

centos kickstart

cd /root/iso/centos mkisofs -o CentOS_6_x86_64_Kickstart.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T . ------------------------------------------------------------------- Kickstart option to avoid "Storage Device Warning" When I added zerombr to my kickstarts that issue went away. I think that should do it b/c the devices will then have a structure that anaconda won't flake out on. ------------------------------------------------------------------- PyCURL couldn't resolve "cdrom:sr0" during CentOS 6.2 kickstart installation I have solved this issue myself, the solution is changing the repo line from repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 to repo --name="CentOS" --baseurl=file:///mnt/source --cost=100 ------------------------------------------------------------------- # Kickstart file automatically generated by anaconda. #version=DEVEL install…
Read more...

Sed在匹配行前后加入一行

a 追加内容 sed ‘/匹配词/a\要加入的内容’ example.file(将内容追加到匹配的目标行的下一行位置)i 插入内容 sed ‘/匹配词/i\要加入的内容’ example.file 将内容插入到匹配的行目标的上一行位置)示例:#我要把文件的包含“chengyongxu.com”这个关键词的行前或行后加入一行,内容为“allow chengyongxu.cn” 1 #行前加 2 sed -i '/allow chengyongxu.com/i\allow chengyongxu.cn' the.conf.file 3 #行前后 4 sed -i '/allow chengyongxu.com/a\allow chengyongxu.cn' the.conf.file
Read more...

CentOS中设置系统级代理

YUM代理设置   编辑/etc/yum.conf,在最后加入 # Proxy proxy=http://username:password@proxy_ip:port/   也可以使用proxy_username和proxy_password来配置代理的用户名和密码   这样的配置完成后,所有的用户在使用yum时,都会使用代理,可以说是全局代理。   如果需要为单独的用户配置代理,可以在用户的~/.bash_profile中设置。   Wget的代理设置   编辑/etc/wgetrc,在最后加入 # Proxy http_proxy=http://username:password@proxy_ip:port/ ftp_proxy=http://username:password@proxy_ip:port/   系统全局代理   如果需要为某个用户设置一个系统级的代理,可以在~/.bash_profile中设置:   http_proxy="http://username:password@proxy_ip:port" export_http_proxy   上面的设置只对某个用户生效,如果要对所有系统用户生效,写在/etc/profile中就可以了。
Read more...

Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/vhosts/shan.info/httpdocs/templates/gk_publisher/html/com_k2/templates/default/category.php on line 191