shell (e)grep正则表达式问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell (e)grep正则表达式问题相关的知识,希望对你有一定的参考价值。
要检查的是字符串$2是否为文本文件的一行,意思即^$2$,但是加单引号的话$2变成了$2两个字符本身,加双引号句首句末又变成了符号。还要注意$2里面可能有空格。。。求写法。
参考技术A 楼主且看我实验[root@master ~]# cat -A temp
$ 2$
$ 2$
$2 $
$2$
$2 aaa$
$^I2$
[root@master ~]# grep -n ^\$2$ temp
4:$2
-----------------------
说明:
cat -A 显示文件的所有控制字符,在每行结束处显示"$",将跳格字符(Tab键)显示为^I, 给你详解一下我每一行的字符如下,
第一行:空格$空格2
第二行:$空格2
第三行:$2空格
第四行:$2
第五行:$2空格空格aaa
第六行:$Tab键2
然后grep -n 打印输出行的行数. ^\$2$, "\" ,去掉$的元字符额特殊解释. 然后^匹配开始,$匹配技结束,就得到第四行则是你想要的字符串$2单独为一行的输出 参考技术B 单引号和双引号可以连在一起用:
>a=2
>echo '$a='"$a"
$a=2
你要注意$2的内容会被作为正则表达式解释,他不能含有正则表达式元字符。
grep -P '^\s+'"$2"'$' file追问
-P 就是能用\s+的意思么?
一般的说grep和egrep就差这个-P?
不是啊,你到网上一搜就知道了。-P 表示使用perl 正则语法。对应的还有 -E -G.egrep grep 是两个不同的程序。都用来匹配文件但是选项不同。
本回答被提问者和网友采纳shell--grep命令+正则表达式+基本语法
什么是正则
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。
在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,可以解释正则的有三种文本处理工具/命令:grep、sed、awk,今天我们先来熟悉grep。
Python也用到正则表达式,与此正则稍有区别,此处讲正则,可以加深我们的理解。
---------------------------------------------------------------------------------
grep
参数
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl \'root\' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color
-c :如果匹配成功,则将匹配到的行数打印出来
-E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
下面我们可以做些练习:
-------------------------
正则介绍
^ 行首
$ 行尾
. 除了换行符以外的任意单个字符
* 前导字符的零个或多个
.* 所有字符
[] 字符组内的任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-z] 小写字母
[A-Z] 大写字母
[a-Z] 小写和大写字母
[0-9] 数字
\\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\\> 单词尾
? 前导字符零个或一个
+ 前导字符一个或多个
x{m} x出现m次
x{m,} x出现m次至多次(至少m次)
x{m,n} x出现m次至n次
abc|def 表示abc或def
a(bc|de)f 表示abcf 或 adef
扩展正则:grep -E 或 egrep
下面是一些练习:
------------------------------------------------------------
基本语法
什么是shell script
将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.
再加上些智能(条件/流控)控制,就变成了智能化脚本了.
变量
part1 为何要有变量
程序的运行就是一些列状态的变量->用变量值的变化去表示
part2 变量命名规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.
最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件最好加上拓展名
例如: sql_bak.tar.gz,log_bak.tar.bz2
part3 系统变量
set 和 env区别
set:显示所有变量
env:环境变量
part4 变量赋值
VARNAME=VALUE
echo $VARNAME
删除变量 unset VARNAME
part5 常用系统变量
PATH
PWD
LANG
HOME
HISTSIZE
PS1
IFS
域分隔符 是空格,换行,TAB键的合集
part6 全局变量与局部变量
[root@MiWiFi-R3-srv ~]# gender=\'male\' #在爹这个位置定义一个局部变量gender
[root@MiWiFi-R3-srv ~]# export money=1000 #在爹这个位置定义一个全局变量money
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]# bash #切换到子bash
[root@MiWiFi-R3-srv ~]# echo $gender #在儿子这里看它爹的局部变量gender,结果为空->看不到
[root@MiWiFi-R3-srv ~]# echo $money #在儿子这里看它爹的全局变量money,可以看到
1000
[root@MiWiFi-R3-srv ~]#
[root@MiWiFi-R3-srv ~]# export hobby=\'piao\' #在儿子这里定义一个全局变量hobby
[root@MiWiFi-R3-srv ~]# exit #退出,进入爹的bash环境
exit
[root@MiWiFi-R3-srv ~]# echo $hobby #爹是看不到儿子的export的,儿子的儿子可以看到
[root@MiWiFi-R3-srv ~]#
part6 定义变量名的边界
[root@MiWiFi-R3-srv ~]# rest_mem=20
[root@MiWiFi-R3-srv ~]# echo ${rest_mem}%
20%
part 7 数据类型
bash中的变量无须声明,拿来就用.默认的变量都会是字符类型,还可以有数字类型,普通的脚本,这两种类型够用了
运算符
part1 算术运算符
+
-
*
/
%
part2 关系操作
与(())连用
<
>
<=
>=
==
!=
&&
||
test命令相关,[]可以达到一样的效果
[root@MiWiFi-R3-srv ~]# x=1
[root@MiWiFi-R3-srv ~]# [ $x -gt 1 ]
[root@MiWiFi-R3-srv ~]# echo $?
0
以上是关于shell (e)grep正则表达式问题的主要内容,如果未能解决你的问题,请参考以下文章