Regex 如何计算文本文件中以日期开头的行数
我有一个文件,其内容如下Regex 如何计算文本文件中以日期开头的行数,regex,bash,clearcase,wc,Regex,Bash,Clearcase,Wc,我有一个文件,其内容如下 2004-10-07 cva create file ... 2003-11-11 cva create version ... 2003-11-11 cva create version ... 2003-11-11 cva create branch ... 现在我想计算这个特定文件中以日期开头的行数。 我该怎么做 如果我使用wc-l 它给出了行的总数(在我的例子中是5行,而我
2004-10-07 cva create file ...
2003-11-11 cva create version ...
2003-11-11 cva create version ...
2003-11-11 cva create branch ...
现在我想计算这个特定文件中以日期开头的行数。
我该怎么做
如果我使用wc-l
它给出了行的总数(在我的例子中是5行,而我想要的是计数应该是4行)一种简单易行的方法:Perl
2004-10-07 cva
2004-10-04
anything
2004-10-07 cva
anything
2004-10-07 cva
2004-10-07 cva
1
2
2
3
3
4
5
您的文件
2004-10-07 cva
2004-10-04
anything
2004-10-07 cva
anything
2004-10-07 cva
2004-10-07 cva
1
2
2
3
3
4
5
您需要perl-lne'++$n if/^\d+-\d+-\d+/;打印$n'您的文件
输出
2004-10-07 cva
2004-10-04
anything
2004-10-07 cva
anything
2004-10-07 cva
2004-10-07 cva
1
2
2
3
3
4
5
计数并仅打印总和
perl-lne'++$n if/^\d+-\d+-\d+/;结束{print$n}您的文件
输出5
使用egrep
-c
计算匹配号码cat您的文件| egrep-c'^[0-9]+-[0-9]+-[0-9]+'
输出5
一种简单易用的方法:Perl
2004-10-07 cva
2004-10-04
anything
2004-10-07 cva
anything
2004-10-07 cva
2004-10-07 cva
1
2
2
3
3
4
5
您的文件
2004-10-07 cva
2004-10-04
anything
2004-10-07 cva
anything
2004-10-07 cva
2004-10-07 cva
1
2
2
3
3
4
5
您需要perl-lne'++$n if/^\d+-\d+-\d+/;打印$n'您的文件
输出
2004-10-07 cva
2004-10-04
anything
2004-10-07 cva
anything
2004-10-07 cva
2004-10-07 cva
1
2
2
3
3
4
5
计数并仅打印总和
perl-lne'++$n if/^\d+-\d+-\d+/;结束{print$n}您的文件
输出5
使用egrep
-c
计算匹配号码cat您的文件| egrep-c'^[0-9]+-[0-9]+-[0-9]+'
输出5
给定:
$ cat file
2004-10-07 cva create file ...
no date
2003-11-11 cva create version ...
no date
2003-11-11 cva create version ...
no date
2003-11-11 cva create branch ...
首先了解如何在文件的每一行上运行正则表达式。假设您使用sed
,因为它相当标准和快速。您还可以使用awk
,grep
,bash
,perl
下面是一个sed
解决方案:
$ sed -nE '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/p' file
2004-10-07 cva create file ...
2003-11-11 cva create version ...
2003-11-11 cva create version ...
2003-11-11 cva create branch ...
然后将其输送至wc
:
$ sed -nE '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/p' file | wc -l
4
$ awk '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/{lc++} END{ print lc }' file
4
或者,您可以在awk
中使用相同的模式,而不需要使用wc
:
$ sed -nE '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/p' file | wc -l
4
$ awk '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/{lc++} END{ print lc }' file
4
或者,使用grep
,使用相同的模式:
$ grep -cE '^[12][0-9]{3}-[0-9]{2}-[0-9]{2}' file
4
(注意:不清楚您的日期格式是
YYYY-MM-DD
还是yyy-DD-MM
如果已知,您可以使模式更加具体。)给定:
$ cat file
2004-10-07 cva create file ...
no date
2003-11-11 cva create version ...
no date
2003-11-11 cva create version ...
no date
2003-11-11 cva create branch ...
首先了解如何在文件的每一行上运行正则表达式。假设您使用sed
,因为它相当标准和快速。您还可以使用awk
,grep
,bash
,perl
下面是一个sed
解决方案:
$ sed -nE '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/p' file
2004-10-07 cva create file ...
2003-11-11 cva create version ...
2003-11-11 cva create version ...
2003-11-11 cva create branch ...
然后将其输送至wc
:
$ sed -nE '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/p' file | wc -l
4
$ awk '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/{lc++} END{ print lc }' file
4
或者,您可以在awk
中使用相同的模式,而不需要使用wc
:
$ sed -nE '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/p' file | wc -l
4
$ awk '/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}/{lc++} END{ print lc }' file
4
或者,使用grep
,使用相同的模式:
$ grep -cE '^[12][0-9]{3}-[0-9]{2}-[0-9]{2}' file
4
(注意:不清楚您的日期格式是
YYYY-MM-DD
还是yyy-DD-MM
如果已知,您可以使模式更具体。)grep“[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}”文件名| wc l
应给出此特定格式的行数。但是,使用awk会更好。grep“[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}”文件名| wc-l
应该给出此特定格式的行数。但是,使用awk会更好。