Linux入门基础之grep的使用
准备测试文本test.txt:
[root@10-13-53-194 ~]# cat -n test.txt
1 SET TIME_ZONE='+00:00' */;set
2 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
3 40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
4 40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
5 40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;SET
6 /*!40101 SET character_set_client = @saved_cs_client */;
7 DROP TABLE IF EXISTS `gtl_posts`;
8 /*!40101 SET @saved_cs_client = @@character_set_client */;
9 /*!40101 SET character_set_client = utf8 */;
10 CREATE TABLE `gtl_posts` (
11 post_password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
12 post_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
13 to_ping` text COLLATE utf8mb4_unicode_ci NOT NULL,
14 pinged` text COLLATE utf8mb4_unicode_ci NOT NULL,
15 post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
16 guid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
17 menu_order` int(11) NOT NULL DEFAULT 0,
18 post_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'post',
19 post_mime_type` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
20 comment_count` bigint(20) NOT NULL DEFAULT 0,
21 PRIMARY KEY (`ID`),
22 KEY `post_name` (`post_name`(191)),
23 KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
24 KEY `post_parent` (`post_parent`),
25 KEY `post_author` (`post_author`)
26 ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
grep完全匹配
完全匹配是在文本里依次查找S,E,T字符,无论在文档中的哪个位置,找到S,E,T连在一起的都匹配,把匹配到的一行文本都输出
我们可以看到上面命令的执行结果,行首,行中,行尾的SET都找到了
要控制正则表达式在哪个位置匹配查找,可以使用定位符,行首定位符^,行尾定位符$
这时候只输出SET在行首和行尾的结果了,注意匹配行首^符号是在关键字的前面的, 匹配行尾$符号是在关键字后面的,如果$放在关键字前面,则得不到正确的结果:
可以看到没有任何输出,因为这时候,$符号不是作为一个行尾标记,而是作为关键字的把一部分了,看下面的例子,注意3个命令的关键字,KEY,KEY,$KEY
第一个的匹配文件中的所有KEY,第二个是匹配文件中以KEY结尾的所有行,第三是匹配文件中$KEY的行
-i参数,不区分大小写进行匹配
其他常用参数:
-v 显示不包含正则表达式的匹配项进行匹配
-r 递归匹配一组文件或者目录(目录下面还有子目录也会去搜锁匹配)
-A n 显示正则表达式之后至第n行的数据
-B n 显示正则表达式之至前面n行的数据
举例:
可以看到,这2个命令,前面一个显示grep命令本身
后面一个命令加了grep -v 'grep',就不显示grep命令本身了
-A 2 ,是指定显示匹配了set之后,匹配行后面的2行也输出
-B n是一样的道理的
那如果我们想同时匹配多个关键字进行查找呢?很简单,-e参数就行
导出的mysql文件,--开头的是注释,我们不想看,就用-v参数过滤掉
[root@10-13-53-194 ~]# grep -v -e '^--' b.txt
/*!40000 ALTER TABLE `gtl_posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*开头的也是注释,如果我们不想看,加-e参数一起过滤掉就可以了
[root@10-13-53-194 ~]# grep -v -e '^--' -e '^/' b.txt
UNLOCK TABLES;