linux字符串匹配
❶ linux中匹配文件中的字符串
cd 路径
grep ' \ <字符串\>' filename
如果有需要自动保存到文件可以这样
grep ' \ <48\>' filename >> 文件名 (追加)
❷ 如何在Linux shell下做中文字符串的匹配
a=$( expr 'helloworld20140501.txt' : '.*\([0-9]\{8\}\).*' )
echo $a
linux shell 中可以将命令的结果赋值给变量,$(命令)这种格式将返回命令执行后的结果字符串
上面命令执行后,变量a的值是20140501
a=`echo 'helloworld20140501.txt'|sed 's/.*\([0-9]\{8\}\).*/\1/'`
这个命令作用也是一样,变量a被赋值为20140501!
❸ linux/unix shell 中expr 字符串匹配问题请教~
个人认为,就是完全匹配与部分匹配的差别。
grep
只要字符串中有部分能够与正则匹配即可,并且会输出匹配的一整行。帮助里这样讲:
grep
searches
the
named
input
FILEs
(or
standard
input)
for
lines
containing
(注意,是containing)
a
match
to
the
given
PATTERN.
By
default,
grep
prints
the
matching
lines.
如果你在终端里正确设置了颜色显示,那么可以看到:
echo
"abcde"
|
grep
"cde"
结果输出
abcde,其中cde是高亮红色显示的(只匹配了部分)。
echo
"abcde"
|
grep
".*cde"
结果也是输出
abcde,其中abcde全是高亮红色显示的。
这表示grep是部分匹配的,只要有部分字符串匹配就OK。
expr
STRING
:
REGEXP
则是完整匹配,输出最后匹配的那个位置(anchor)。帮助里这样说的:
STRING
:
REGEXP
anchored
pattern
match
of
REGEXP
in
STRING
规定了:后面必须跟正则表达式,用于格式匹配。
.*b
是正则表达式,可用于匹配任何以b结尾的字符串。
但“cde”如果被用作完全匹配的话,就是必须匹配以c开头的字符串,显然匹配不到,因为:前的字符串以a开头。^_^
如果改为
expr
"cdeab"
:
"cde"
,这样就可以匹配成功并且返回3。
看看源码应该能更清楚内部实现方式的区别。我没看过,因此也不好多说了。以上纯属个人看法,仅供探讨。
❹ linux 正则如何获取匹配字符串
grep-oE"[0-9]+"
❺ Linux C语言 在文件中查找字符串匹配关键字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME_MAX 50
#define SEPERATE_STRING_MAX 100
int StrCount(FILE *file,char *str);
int main()
{
char *filename,*spestr;
FILE *fp;
filename=(char *)malloc(FILE_NAME_MAX);
spestr=(char *)malloc(SEPERATE_STRING_MAX);
printf("Input the filename:");
while(1)
{
scanf("%s",filename);
fp=fopen(filename,"r");
if(fp!=NULL)
{
break;
}
printf("Can't open the file.Try Again!");
}
printf("Input the special string:");
scanf("%s",spestr);
printf("%d times of %s in %s.",StrCount(fp,spestr),spestr,filename);
fclose(fp);
free(filename);
free(filename);
return 0;
}
int StrCount(FILE *file,char *str)
{
int count=0;
char ch;
int p=0;;
while((ch=fgetc(file))!=EOF)
{
// 当前读入的字符匹配 str 相应位置的字符
if(ch == str[p])
{
// 匹配下一个字符
p++;
// 如果已经匹配成功
if(str[p] == '\0')
{
count++;
// 从头开始重新匹配
p = 0;
}
}
// // 当前读入的字符不匹配 str 相应位置的字符
else
{
❻ linux 根据简单字符匹配文件夹中是否存在包含此字符的文件名
1、可以使用grep命令来查找当前目录下所有文件中包含的某个特定字符。2、示例:查找当前目录下所有带有set的文件。说明:-r是递归查找-n是显示行号*:表示当前目录所有文件,也可以是某个文件名
❼ linux 统计匹配字符串的行数
这是给出字符串"hi"统计目录/path/to/test. 可以把命令中的这两个参数换成你需要的.
find/path/to/test-name"*.txt"-typef-print0|xargs-0-n1awk'/hi/{a++}END{if(a>0){printFILENAME":"a}}'
❽ linux 变量值中匹配字符
#!/bin/sh
#来自:DZ动力
i="1:sads:212:354"
echo$i|grep"^[0-9]:sads"
❾ linux 正则表达式怎么匹配
php">一.linux文本查找命令
在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令:
1.grep:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。
2.egrep:扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。
3.fgrep:快速grep,这个版本匹配固定字符串而非正则表达式。并且是唯一可以并行匹配多个字符串的版本。
如下简单的介绍grep命令:
语法格式:
grep[options...]pattern-spec[files...]
用途:
匹配一个或多个模式的文本行。
options:
-E:使用扩展正则表达式进行匹配,grep-E或取代egrep命令。
-F:使用固定字符串进行匹配,grep-F或取代传统的fgrep命令。
-e:通常第一个非选项的参数认为是要匹配的模式,也可以同时提供多个模式,只要将其放入单引号,并用换行字符分隔他们。
模式以减号开头时,为防止混淆其为选项,-e选项说明其后的参数为模式,即使他以减号开头。
-f:从pat-file文件读取模式作为匹配。
-i:模式匹配时忽略大小写差异。
-l:列出匹配模式的文件名称,而不是打印匹配的行。
-q:静默的,如果匹配成功,不将匹配的行输出到标准输出;否则即是不成功。
-s:不显示错误信息,通常与-q并用。
-v:显示不匹配模式的行。
说明:可以同时查找多个文件中的内容,当指定多个文件时,每个显示出的文件行前会有文件名加一个冒号标识其来自哪个文件。
可以使用多个-e或-f选项,建立要查找的模式列表。
二.正则表达式简要介绍
1.正则表达式的组成
(1).一般字符:没有特殊意义的字符
(2).特殊字符(meta字符):元字符,有在正则表达式中有特殊意义
2.如下讲下正则表达式中的常见meta字符
(1).POSIXBRE与ERE中都有的meta字符:
:通常用于打开或关闭后续字符的特殊含义,如(...)与{...}
.:匹配任何单个字符(除NUL)
*:匹配其前的任何数目或没有的单个字符,例:.表示任一字符,则.*匹配任一字符的任意长度
^:匹配紧接着的正则表达式,BRE中仅在正则表达式的开头有特殊的含义,ERE中在任何位置都有特殊含义
$:匹配前面的正则表达式,在字符串或者行结尾处。BRE中仅在正则表达式的结尾处有特殊的含义,ERE中在任何位置都有特殊含义
[]:匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符,
(2).POSIXBRE中才有的字符:
{n,m}:区间表达式,匹配在它前面的单个字符重现的次数区别。{n}指重现n次;{n,m}指重现n至m次;
():保留空间,可以将最多9个独立的子模式存储在单个模式中。如(ab).*1:
指匹配ab组合的两次重现,中间可存在任意数目的字符。
:重复在(与)方括号内第n个子模式至此点的模式。
(3).POSIXERE中才有的字符:
{n,m}:与BRE的{n,m}功能相同
+:匹配前面正则表达式的一个或多个扩展
?:匹配前面正则表达式的零个或一个扩展
|:匹配|符号前或后的正则表达式
():匹配方括号括起来的正则表达式群
(4).方括号([])表达式
4.1.字符集[::]
标识字符集,有如下几种:
[::alnum]
:数字字符
[:digit:]
:数字字符
[:punct:]
:标点符号字符
[:alpha:]
:字母字符
[:graph:]
:非空格字符
[:space:]
:空格字符
[:blank:]
:空格与定位字符
[:lower:]
:小写字母字符
[:upper:]
:大写字母字符
[:cntrl:]
:控制字符
[:print:]
:可显示的字符
[:xdigit:]
:16进制数字
4.2.排序符号
指将多个字符视为一个符号,如[.ch.]即将ch视为一个符号
4.3.等价字符
认为多个字符相等,如[=e=]在法文的locale里,可匹配于多种与e相似的字符,此处不再列出。
说明:这三种构造除其自身的方括号之外,还必须使用额外的方括号括起来。
例:[[:alpha:]!]:匹配任一英文字母或感叹号。
[[.ch.]:匹配ch排序元素,而不匹配单独的字母c或h.
3.简单正规表达式匹配案例
china:匹配此行中任意位置有china字符的行
^china:匹配此以china开关的行
china$:匹配以china结尾的行
^china$:匹配仅有china五个字符的行
[Cc]hina:匹配含有China或china的行
Ch.na:匹配包含Ch两字母并且其后紧跟一个任意字符之后又有na两个字符的行
Ch.*na:匹配一行中含Ch字符,并且其后跟0个或者多个字符,再继续跟na两字符
二.实例
如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:
www..comhttp://www..comhttps://www..comhttp://wwwcom.com
1.url匹配
匹配以http或者https开头,并且其后为:并且含有.的串
BRE匹配:
grep'^https{0,1}.*..*'url.txt
ERE匹配:
grep-E'^https?.*..*'url.txt
匹配结果如下:
http://www..comhttps://www..com
2.Email匹配
示例文件内容为:
[email protected]@[email protected]@gmail.com
@@.com
匹配以字母数字或者下划线开头的多个字符,其后有一个@之后有多个字母数字或者下划线,其中有一个.号
grep'^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*..*'email.txt
匹配结果:
[email protected]@[email protected]
先到这里,后续再接着写。
❿ 如何在linux下匹配两个文件的相同字符串
可以使用vim打开文件,然后通过 vim编辑 中的 /(向后查找)或者 ?(向前查找)来查找相应的字符串。
示例:用vim打开/etc/passwd查找admin用户名
vim /etc/passwd
打开文件后,直接输入 /admin 回车即可查找如下图所示:
回车执行,vim查找到后,会标识出来,如下图所示:
另外:使用vim也可以打开可执行程序来查找字符串(在程序没有加壳或者使用其它字符串保护的前提下)。
示例:在test程序中查找hello字符串。
虽然使用vim打开二进制程序文件,显然的是乱码,但是明文字符串依然能查找到,如下图所示:
扩展:在Linux中如果要查找二进程文件即应用程序中的字符串,可以使用反汇编器、调试器等等,比如IDA,就提供强大的字符串查找功能。