grep 命令可以用于在指定文件中通过指定查找模式查找指定字符串。

注:与该命令有关的还有
egrep和fgrep可以关注一下。
该命令的语法如下:
grep [选项] [查找模式] [文件名1, 文件名2, ...]
该命令支持的选项有:
| 选项 | 说明 |
|---|---|
| -a, --text | 不要忽略二进制的数据 |
-A <显示行数>, --after-context=<显示行数> | 除了显示符合范本样式的那一列之外,并显示该行之后的内容 |
| -b, --byte-offset | 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量 |
-B <显示行数>, --before-context=<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前的内容 |
| -c, --count | 只显示匹配行的数量 |
-C <显示行数>, --context=<显示行数>, -<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前后的内容 |
-d <动作>, --directories=<动作> | 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作 |
-e <范本样式>, --regexp=<范本样式> | 指定检索使用的模式 |
| -E, --extended-regexp | 每个模式作为一个扩展的正则表达式对待 |
-f <规则文件>, --file=<规则文件> | 从expfile文件中获取要搜索的模式,一个模式占一行 |
| -F, --fixed-regexp | 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式 |
| -G, --basic-regexp | 将样式视为普通的表示法来使用 |
| -h, --no-filename | 在在查找多个文件时,指示grep不要将文件名加入到输出之前 |
| -H, --with-filename | 在显示符合样式的那一行之前,表示该行所属的文件名称 |
| -i, --ignore-case | 比较时不区分大小写 |
| -l, --file-with-matches | 列出文件内容符合指定的样式的文件名称 |
| -L, --files-without-match | 列出文件内容不符合指定的样式的文件名称 |
| -n, --line-number | 在输出前加上匹配串所在行的行号(文件首行行号为1) |
| -o, --only-matching | 只显示匹配PATTERN 部分 |
| -q, --quiet或–silent | 不显示任何信息 |
| -r, --recursive | 此参数的效果和指定"-d recurse"参数相同 |
| -s, --no-messages | 不显示错误信息 |
| -v, --invert-match | 显示不包含匹配文本的所有行 |
| -V, --version | 显示版本信息 |
| -w, --word-regexp | 只显示全字符合的列 |
| -x, --line-regexp | 只显示整行严格匹配的行 |
| -y | 此参数的效果和指定"-i"参数相同 |
注:虽然选项很多,但不需要记住大部分选项,只需要知道该命令的一些常用用法即可。
最常用的用法应该是在文件中查找指定关键字,语法格式如下:
# 语法
grep 指定关键字 指定文件
# 示例
grep "world" log.txt

注:待查找的指定关键字建议用双引号引起来,特别是在有空格的情况下。
有时候我们想要显示那些除了匹配的关键字之外的所有行,可以加上 -v 选项:
# 语法
grep -v 指定关键字 指定文件
# 示例
grep -v "world" log.txt

有时候我们希望看到匹配到的行在文件中的行号是多少,那么可以使用 -n 选项:
# 语法
grep -n 指定关键字 指定文件
# 示例
grep -n "world" log.txt

如果我们想要获取匹配到的总行数,那么可以使用 -c 选项:
# 语法
grep -c 指定关键字 指定文件
# 示例
grep -c "o" log.txt

除了显示匹配行之外,可能我们还需要显示匹配行之前几行或者之后几行的信息。那么可以使用 -A 或 -B 或 -C 选项:
# 语法
grep -A 指定行数 指定关键字 指定文件
grep -B 指定行数 指定关键字 指定文件
grep -C 指定行数 指定关键字 指定文件
# 示例,表示显示 log.txt 文件中匹配到 "world" 的行及下面的 2 行内容
grep -A 2 "world" log.txt

注:
A选项,是After的缩写,表示除了展示匹配行之外,还要展示出匹配行下面的若干行。如-A 2表示还展示匹配行下面 2 行的内容。B选项,是Before的缩写,表示除了展示匹配行之外,还要展示出匹配行上面的若干行。如-B 2表示还展示匹配行上面 2 行的内容。C选项,是-A和-B选项的合体,表示除了展示匹配行之外,还要展示出匹配行上面和下面各若干行。如-C 2表示还展示匹配行上面 2 行和下面 2 行的内容。
有时候匹配的时候,希望忽略掉大小写,让大写和小写字母都能被匹配到,可以使用 -i 选项:
# 语法
grep -i 指定关键字 指定文件
# 示例
grep -i "WORLD" log.txt

grep 命令是支持多文件查找的,显示结果它会输出匹配行内容和匹配行所在文件名。

如果想要只显示匹配内容在那些文件中,可以加上 -l 选项,得到的就是一个包含有匹配内容的文件列表,而如果使用 -L 选项,则会得到一个不包含有匹配内容的文件列表。

grep 命令是支持正则表达式的,但是是支持基本正则表达式。即在基本正则表达式(BRE)中,只承认“^”、“$”、“.”、“[”、“]”、“*”这些是元字符,所有其他的字符(如 “(”、“)”、“{”、“}”、“?”、“+”、“|” 等)都被识别为普通字符。语法如下:
# 语法
grep 基本正则表达式 指定文件
# 示例,搜索 log.txt 文件中以 "h" 开头的行
grep "^h" log.txt

如果要使用扩展正则表达式,即支持 “(”、“)”、“{”、“}”、“?”、“+”、“|” 等元字符。那么需要加上 -E 选项,或者使用 egrep 命令:
# 语法
grep -E 扩展正则表达式 指定文件
# 示例,搜索 log.txt 文件中包含至少一个 "h" 字符的行
grep -E "h+" log.txt

如果我们想要精确搜索某个词,那么使用 -w 选项。

如果我们要查找指定目录下所有符合条件的文件,那么可以使用 -r 选项:
# 语法
grep -r 指定关键字 指定目录名
# 示例,查找 /home/ 目录下所有包含 "hello" 字符串的文件
grep -r "hello" /home/

总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解