关于grep匹配tab键
时间:2006-06-13 来源:busyant
系统管理的时候碰到这样一个问题:
a.txt文本文件中存储着中文姓名,每行一个,如:
李明
王皓
李明君
b.txt文本文件中存储着邮箱地址,中文姓名,所属部门等信息,每个信息用tab键隔开,每行一条数据,如:
[email protected] <tab>李明<tab>人力资源部
[email protected] <tab>李明01<tab>IT支持部
[email protected] <tab>李明君<tab>销售管理部
[email protected] <tab>王皓<tab>IT支持部
需要根据a.txt中的姓名提取b中的邮箱地址,于是编写脚本如下:
但因为姓名当中重复文字的原因,导致查找“李明”时会查找出“李明01”和“李明君”,因为需要匹配出带数字的帐户,但匹配出“李明君”显然是错误的,于是修改为:
问题依然存在,“李明君”同样会被匹配出来,于是想到匹配后面的这个tab键,但尝试了N种方法:
grep "$USER[0-9]\{0,2\} "————失败,因为不是空格;
grep -P "$USER[0-9]\{0,2\}\s"——想用perl里面的\s,同样失败;
grep "$USER[0-9]\{0,2\}<tab>"——《Linux Shell编程》里面是这样写的,结果仍然是失败;
最后没辙了,搜cu里面的精华贴,搜到一个,提问匹配tab键的,但回复都是替代方法,而没有根本的解决问题,
于是google,找啊找……
不知道是哪一页了突然看到这段(http://www.yuanma.org/data/2006/0509/article_376.htm)
就是它了,于是修改成如下:
正解!
#!/bin/sh
USERS=`cat a.txt` for USER in $USERS ; do CNT=`grep "$USER" b.txt|wc -l|awk '{print $1}'` MAIL=`grep "$USER" b.txt` if [ $CNT -gt 1 ]; then printf "$MAIL\n" else MAIL2=`grep "$USER" b.txt|awk -F'\t' '{print $1}'` printf "$MAIL2\n" fi done |
#!/bin/sh
USERS=`cat a.txt` for USER in $USERS ; do CNT=`grep "$USER[0-9]\{0,2\}" b.txt|wc -l|awk '{print $1}'` MAIL=`grep "$USER[0-9]\{0,2\}" b.txt` if [ $CNT -gt 1 ]; then printf "$MAIL\n" else MAIL2=`grep "$USER[0-9]\{0,2\}" b.txt|awk -F'\t' '{print $1}'` printf "$MAIL2\n" fi done |
grep允许使用国际字符模式匹配。类名及其等价的正则表达式: 类 正则表达式 [[:upper:]] [A-Z] [[:lower:]] [a-z] [[:digit:]] [0-9] [[:alnum:]] [0-9a-zA-Z] [[:space:]] 空格或tab键 [[:alpha:]] [a-zA-Z] |
#!/bin/sh
USERS=`cat a.txt` for USER in $USERS ; do CNT=`grep "$USER[0-9]\{0,2\}[[:space:]]" b.txt|wc -l|awk '{print $1}'` MAIL=`grep "$USER[0-9]\{0,2\}[[:space:]]" b.txt` if [ $CNT -gt 1 ]; then printf "$MAIL\n" else MAIL2=`grep "$USER[0-9]\{0,2\}[[:space:]]" b.txt|awk -F'\t' '{print $1}'` printf "$MAIL2\n" fi done |
相关阅读 更多 +