Bash - 将命令的结果拆分为":"并使用第一部分调用程序

时间:2014-04-16 09:55:38

标签: bash awk grep

我使用以下命令在一组文件夹中的文件中搜索文本:

#    get a list of files     get the contents           find the search string and        don't show any results
#                                                           print the line number          where the line is more than 400 chars
#          |                        |                             |                               |
#          v                        v                             v                               v
find app public/javascripts | awk '{print "\""$0"\""}' |xargs grep -n "new_pupil_group_form" | awk 'length($0) < 400'

这一切都很好:我得到这样的结果,这正是我想看到的。

app/views/cmw/pupil_groups/index.html.erb:65:  <%= render :partial => "cmw/pupil_groups/new_pupil_group_form" %>
app/views/cmw/pupil_groups/edit.html.erb:52:  <%= render :partial => "cmw/pupil_groups/new_pupil_group_form" %>
app/views/cmw/pupil_groups/create.js.rjs:9:  page.replace_html "modal-new-class", :partial => "cmw/pupil_groups/new_pupil_group_form"  
app/views/pupil_groups/_class_modals.html.erb:2:  <%= render :partial => "cmw/pupil_groups/new_pupil_group_form" %>

我喜欢获取行号,因为我可以使用文件和行号调用我喜欢的文本编辑器(geany),然后打开焦点:

geany app/views/cmw/pupil_groups/index.html.erb:65

有时我想将搜索的所有结果传递给geany,即打开结果中的所有文件。为了实现这一目标,我应该在命令的最后添加什么?我认为解决方案涉及将结果分成&#34;:&#34; (注意空格)并使用第一部分,我已尝试用awk执行此操作但无法管理它。

谢谢,最大

3 个答案:

答案 0 :(得分:1)

您可以在awk中执行此操作:

geany $(find public/javascripts/ -type f -exec awk '/new_pupil_group_form/ && length($0) < 400 { printf FILENAME":"FNR" "}' {} \;)

这将匹配包含new_pupil_group_form长度为< 400的所有行,并打印它们。我正在使用printf,因此输出全部在一行上。 FNR为每个输入文件重置,因此给出了正确的行号。

公共/ Javascript角/ A

line 1
new_pupil_group_form blah blah blah
line 2

公共/ Javascript角/ C

line 1
line 2
new_pupil_group_form
line 4

命令

geany public/javascripts/a:2 public/javascripts/c:3

您可以通过稍微修改脚本来重现原始行为:

find public/javascripts/ -type f -exec awk '/new_pupil_group_form/ && length($0) < 400 { print FILENAME":"FNR": "$0}' {} \;

输出

public/javascripts/a:2: new_pupil_group_form blah blah blah
public/javascripts/c:3: new_pupil_group_form 

答案 1 :(得分:1)

您可能希望首先使用冒号分隔字符串作为分隔符 然后从你想要的输入组成:

echo "foo:25: bar " | awk -F ':' '{print $1":"$2}'

将打印

foo:25

所以完整的命令是:

find app public/javascripts | awk '{print "\""$0"\""}' |xargs grep -n "new_pupil_group_form" | awk 'length($0) < 400' | awk -F ':' '{print $1":"$2}'  | xargs geany

答案 2 :(得分:1)

这个怎么样:

geany $(find . -type f -exec grep -Hn -m1 new_pupil {} \; | awk -F: '{print $1":"$2}')