如何在ubuntu中使用grep计算新行数

如何在ubuntu中使用grep计算新行数,ubuntu,grep,escaping,special-characters,Ubuntu,Grep,Escaping,Special Characters,(最后一个提示,在问题的开头:我在提问之前已经解决了这个问题,滚动到最后) 我正在尝试解析一个大文件,在我进行更改之前,我想我会运行一些“简单”的测试来确认我得到了所需的输出,但是我做得不够 以下是文件格式的捕获: 00000030 32 2e 31 2e 30 65 2c 0d 0a 43 4c 49 45 4e 54 5f |2.1.0e,..CLIENT_| 00000040 44 45 4d 4f 2c 31 2c 31 2c 22 4c 4b 44 55 41 32 |DE

(最后一个提示,在问题的开头:我在提问之前已经解决了这个问题,滚动到最后)

我正在尝试解析一个大文件,在我进行更改之前,我想我会运行一些“简单”的测试来确认我得到了所需的输出,但是我做得不够

以下是文件格式的捕获:

00000030  32 2e 31 2e 30 65 2c 0d  0a 43 4c 49 45 4e 54 5f  |2.1.0e,..CLIENT_|
00000040  44 45 4d 4f 2c 31 2c 31  2c 22 4c 4b 44 55 41 32  |DEMO,1,1,"LKDUA2|
我想做的是将所有的新行
\x0d\x0a
\r\n
转换成我使用的其他内容
\x09
\t
,这样我就可以重新解析它,并且只将其中的一些内容转换回新行

我意识到可能有更好的方法来做到这一点,但我一直在努力用我已经(以为我)知道的方法来工作

首先,我进行了一些试验:

tr -s '\r\n' '\t' < orig > o.rnt
tr -s '\n' '\t' < orig > o.nt
tr -s '\r' '\t' < orig > o.rt
这些结果与预期一致。差值为5248,即换行数。到目前为止,一切顺利

额外的账单怎么了 我又添加了一个测试,但事情并不像预期的那样:

tr -s '\r\n' '\t\t' < orig > o.rntt

-rw-rw-r-- 1 madivad madivad 615271 Oct 30 09:40 o.rntt
(注:这(Q1)更多的是一个附带问题,我只是在确认所有问题时才发现这一点,我真正的问题如下)

如何正确测试或计算“换行符” 在运行我的测试时,我想计算一下新行的出现次数,我用几种方法确认了这一点,得到了正确的5248。。。为了一些结果。似乎
\n
未正确解析

$ grep -c ^ orig
5248
$ grep -c -P '\r' orig
5248
$ grep -c -P '\r' o.rt
5248
$ grep -c -P '\x0d' o.rt
5248
$ grep -c -P '\t' o.rnt
1
$ grep -c -P '\n' orig
0
$ grep -c -P '\x0a' orig
0
$ grep -c -P '\r\n' orig
0
转换和测试的确认 对于输出文件,
tr'\r\n'\t'o.rnt
似乎做得不错,但我的
grep
测试它是错误的:

$ hexdump -C -n 600 o.rnt | grep -P ' 09 '
00000030  32 2e 31 2e 30 65 2c 09  43 4c 49 45 4e 54 5f 44  |2.1.0e,.CLIENT_D|
00000110  2c 22 22 2c 31 2c 2c 09  43 4c 49 45 4e 54 5f 41  |,"",1,,.CLIENT_A|
000001a0  22 22 2c 30 2c 22 22 2c  09 43 4c 49 45 4e 54 5f  |"",0,"",.CLIENT_|
00000200  73 65 2c 46 61 6c 73 65  2c 30 2c 09 43 4c 49 45  |se,False,0,.CLIE|
00000230  31 2c 09 43 4c 49 45 4e  54 5f 43 4e 53 4e 54 2c  |1,.CLIENT_CNSNT,|

$ grep -c -P '\t' o.rnt
1
$ hexdump -C -n 600 o.nt | grep -P ' 09 '
00000030  32 2e 31 2e 30 65 2c 0d  09 43 4c 49 45 4e 54 5f  |2.1.0e,..CLIENT_|
00000110  30 2c 22 22 2c 31 2c 2c  0d 09 43 4c 49 45 4e 54  |0,"",1,,..CLIENT|
000001a0  22 2c 22 22 2c 30 2c 22  22 2c 0d 09 43 4c 49 45  |","",0,"",..CLIE|
00000200  46 61 6c 73 65 2c 46 61  6c 73 65 2c 30 2c 0d 09  |False,False,0,..|
00000230  2c 31 32 30 31 2c 0d 09  43 4c 49 45 4e 54 5f 43  |,1201,..CLIENT_C|

$ grep -c -P '\t' o.nt
1
在我使用的地方:
tr-s'\n'\t'o.nt
它似乎也起了作用,我的测试又错了:

$ hexdump -C -n 600 o.rnt | grep -P ' 09 '
00000030  32 2e 31 2e 30 65 2c 09  43 4c 49 45 4e 54 5f 44  |2.1.0e,.CLIENT_D|
00000110  2c 22 22 2c 31 2c 2c 09  43 4c 49 45 4e 54 5f 41  |,"",1,,.CLIENT_A|
000001a0  22 22 2c 30 2c 22 22 2c  09 43 4c 49 45 4e 54 5f  |"",0,"",.CLIENT_|
00000200  73 65 2c 46 61 6c 73 65  2c 30 2c 09 43 4c 49 45  |se,False,0,.CLIE|
00000230  31 2c 09 43 4c 49 45 4e  54 5f 43 4e 53 4e 54 2c  |1,.CLIENT_CNSNT,|

$ grep -c -P '\t' o.rnt
1
$ hexdump -C -n 600 o.nt | grep -P ' 09 '
00000030  32 2e 31 2e 30 65 2c 0d  09 43 4c 49 45 4e 54 5f  |2.1.0e,..CLIENT_|
00000110  30 2c 22 22 2c 31 2c 2c  0d 09 43 4c 49 45 4e 54  |0,"",1,,..CLIENT|
000001a0  22 2c 22 22 2c 30 2c 22  22 2c 0d 09 43 4c 49 45  |","",0,"",..CLIE|
00000200  46 61 6c 73 65 2c 46 61  6c 73 65 2c 30 2c 0d 09  |False,False,0,..|
00000230  2c 31 32 30 31 2c 0d 09  43 4c 49 45 4e 54 5f 43  |,1201,..CLIENT_C|

$ grep -c -P '\t' o.nt
1
谢谢 我不想继续前进,直到我明白我错在哪里,这样我就不会进一步加剧问题:)

我算出来了 如上所述,我实际上已经解决了这个问题,但现在可以问:

1.有更好的办法吗? 这是我提出的测试,我很高兴有任何改进:

$ grep -o -P '\t' o.nt | wc -l
5249
哦,是的,还有一个额外的
\t
,因为文件中实际上有一个额外的选项卡(长话短说)

回顾过去,我会如何使用hextump计算它,并注意到线路交叉?在做最后的测试时,我终于得到了它 我已经做好了发布这个问题的准备,就像过去发生在我身上的无数次一样,问一个stackexchange问题导致我在发布答案之前就已经知道了答案

我已经这样做了一个多小时了,但是我看到了我的错误。我仍在发布这篇文章,因为我花了这么多时间学习,也许这可以防止其他人这样做:/

我忘记了
grep-c
将计算行数,通过删除
newline
字符,文件中只有一行:(

我想出了这个测试:

$ grep -o -P '\t' o.nt | wc -l
5249

谢谢你,这是我多次尝试不同事物后留下的。我只是向上箭头,改变我在单引号之间的行中的内容。
$ grep -o -P '\t' o.nt | wc -l
5249