grep 命令

##问题

  1. 最近在做一些统计的事情,碰见应该问题:有类似如下文本(text.txt)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1. 要输就输给追求,要嫁就嫁给幸福。在高手的世界里,往前是阴霾,往后是山崖。
    2. 年少轻狂就一回,你说我能惯着谁。
    3. 倘若世间全是正义,我偏要做那唯一的邪恶,为正义存在的邪恶。
    4. 人生不过百十岁,寻你却要千万年。
    5. 境界决定思维,思维决定想法,想法决定位置,位置决定成就。
    6. 所遇人,必有胜我之处,对于胜我者,必学之。
    2. 我可以放弃选择,但是不能选择放弃。
    3. 人生像打电话,不是你先挂就是我先挂
    4. 人生---下课啦..放学啦..放假啦..毕业啦..混够啦..老啦..后悔啦..死啦...
    2. 再测试1遍

请统计前面的数字有多少种?其实思路很简单,把前面的数字拿出来,去重然后求行数.找到这些数字当然使用grep命令了

grep -o '^[0-9]*' test.txt|uniq|sort|wc -l

通过上面的命令就可以解出来了.因为之前对grep的一些参数和扩展不是很熟悉,现在做个小总结.

##小总结

  1. 介绍
    Grep 搜索以 FILE 命名的文件输入 (或者是标准输入,如果没有指定文件名,或者给出的文件名是 - 的话),寻找含有与给定的模式 PATTERN 相匹配的内容的行。默认情况下, grep 将把含有匹配内容的行打印出来。
    另外,也可以使用两个变种程序 egrep 和 fgrep 。 Egrep 与 grep -E 相同。 Fgrep 与 grep -F 相同。
    grep [options] PATTERN [FILE…]
    grep [options] [-e PATTERN | -f FILE] [FILE…]
  2. 常用选项
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    -A NUM, --after-context=NUM
    打印出紧随匹配的行之后的下文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。
    -B NUM, --before-context=NUM
    打印出匹配的行之前的上文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。
    -C NUM, --context=NUM
    打印出匹配的行的上下文前后各 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。
    -c, --count
    禁止通常的输出;作为替代,为每一个输入文件打印一个匹配的行的总数。如果使用 -v, --invert-match 选项 (参见下面),将是不匹配的行的总数。
    -E, --extended-regexp
    将模式 PATTERN 作为一个扩展的正则表达式来解释 (参见下面)。
    -e PATTERN, --regexp=PATTERN
    使用模式 PATTERN 作为模式;在保护以 - 为起始的模式时有用。
    -F, --fixed-strings
    将模式 PATTERN 视为一个固定的字符串的列表,用新行 (newlines) 分隔,只要匹配其中之一即可。
    -P, --perl-regexp
    将模式 PATTERN 作为一个 Perl 正则表达式来解释。
    -f FILE, --file=FILE
    从文件 FILE 中获取模式,每行一个。空文件含有0个模式,因此不匹配任何东西。
    -G, --basic-regexp
    将模式 PATTERN 作为一个基本的正则表达式 (参见下面) 来解释。这是默认值。
    -H, --with-filename
    为每个匹配打印文件名。
    -h, --no-filename
    当搜索多个文件时,禁止在输出的前面加上文件名前缀。
    -i, --ignore-case
    忽略模式 PATTERN 和输入文件中的大小写的分别。
    -m NUM, --max-count=NUM
    在找到 NUM 个匹配的行之后,不再读这个文件。如果输入是来自一个普通文件的标准输入,并且已经输出了 NUM 个匹配的行, grep 保证标准输入被定位于退出时的最后一次匹配的行之后,不管是否指定了要输出紧随的下文的行。这样可以使一个调用程序恢复搜索。当 grep 在 NUM 个匹配的行之后停止,它会输出任何紧随的下文的行。当使用了 -c 或 --count 选项的时候, grep 不会输出比 NUM 更多的行。当指定了 -v 或 --invert-match 选项的时候, grep 会在输出 NUM 个不匹配的行之后停止。
    -n, --line-number
    在输出的每行前面加上它所在的文件中它的行号。
    -o, --only-matching
    只显示匹配的行中与 PATTERN 相匹配的部分。
    -R, -r, --recursive
    递归地读每一目录下的所有文件。
    --include=PATTERN
    仅仅在搜索匹配 PATTERN 的文件时在目录中递归搜索。
    --exclude=PATTERN
    在目录中递归搜索,但是跳过匹配 PATTERN 的文件。
    -v, --invert-match
    改变匹配的意义,只选择不匹配的行。
    -Z, --null
    输出一个全零字节 (ASCII 码中的 NUL 字符) 而不是一般情况下输出在文件名之后的字符。例如, grep -lZ 在每个文件名之后输出一个全零字节而不是普通的新行符。这个选项使得输出清楚明白,即使文件名的表示中包含特殊字符比如新行符。这个选项可以与命令 find -print0, perl -0, sort -z, 和 xargs -0 一起使用,来处理任意的文件名,即使是那些含有新行符的文件名。