我想在经常有非常长的行的HTML文件上运行ack或grep。 我不想看到反复换行的非常长的行。 但是,我确实希望只看到包含与正则表达式匹配的字符串周围部分的长行。如何使用Unix工具的任何组合来实现这一点?
-oE
,可能需要将模式更改为".{0,10}<原始模式>.{0,10}"
,以便在其周围看到一些上下文信息:
-o, --only-matching 仅显示与PATTERN匹配的文本行中匹配部分。例如(来自@Renaud的评论):
-E, --extended-regexp 将模式解释为扩展正则表达式(即强制grep作为egrep运行)。
grep -oE ".{0,10}mysearchstring.{0,10}" myfile.txt
另外,您可以尝试使用-c
:
-c,--count 抑制正常输出;而是为每个输入文件打印匹配行的计数。 使用 -v,--invert-match 选项(见下文)时,计算不匹配的行。
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
打印出 qqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
。 - Ulises LayeraoE ".{0,20}mysearchstring.{0,20}"
时,你会失去内部“原始”字符串与上下文的高亮显示,因为整个内容都成为了搜索模式。希望能找到一种方法,在搜索结果周围保留一些非高亮的上下文,以便更轻松地进行视觉扫描和结果解释。 - Aaron Wallentinex
是上下文字符数)引起的突出显示问题 - 在末尾添加| grep foo
。适用于ack或grep解决方案。更多解决方案也在这里:https://unix.stackexchange.com/questions/163726/limit-grep-context-to-n-characters-on-line - Aaron Wallentine通过cut
命令处理你的结果。我还考虑添加一个--cut
开关,这样你就可以使用--cut=80
来获取只有80列的结果。
| cut=c1-120
到 grep 命令中,对我而言有效(尽管不知道如何在匹配的文本周围进行截取)。 - Jake Rayson| cut -c 1-100
https://dev59.com/ZnI-5IYBdhLWcg3wCz7y#48954102 - CrandellWS$COLUMNS
的--no-wrap
选项怎么样? - naught101您可以使用less作为ack的分页器,并缩短长行:ack --pager="less -S"
这将保留长行但仅在一行上显示,而不是换行。要查看行的更多内容,请在less中使用箭头键向左/右滚动。
我已经设置了以下别名来执行此操作:
alias ick='ack -i --pager="less -R -S"'
--pager
命令放入您的 ~/.ackrc 文件中。 - Andy Lesterack
。 - Brian Petersonack
在大多数情况下与 grep
类似,只是更简单。 - Aaron Wallentine获取从1到100的字符。
cut -c 1-100
cut -c 1-$(tput cols)
.bashrc
文件中:grepl() {
$(which grep) --color=always $@ | less -RS
}
grepl
和任何可用于grep
的参数。使用箭头键查看更长行的尾部。使用q
退出。grepl() {
:定义一个新函数,在每个(新)bash控制台中都可用。$(which grep)
:获取grep
的完整路径。(Ubuntu为grep
定义了一个等效于grep --color=auto
的别名。我们不想要该别名,而是原始的grep
。)--color=always
:对输出进行着色。(来自别名的--color=auto
无法工作,因为grep
检测到输出被放入管道中,然后不会对其进行着色。)$@
:将所有传递给grepl
函数的参数放在这里。less
:使用less
显示行-R
:显示颜色S
:不要换行长行The Silver Searcher (ag)通过--width NUM
选项本地支持该功能。它将用[...]
替换较长行的其余部分。
示例(在120个字符后截断):
$ ag --width 120 '@patternfly'
...
1:{"version":3,"file":"react-icons.js","sources":["../../node_modules/@patternfly/ [...]
ag
中,宽度是从第一个字符“开始”的,所以当字符串位于非常长的行中间时,这种方法并不完全适用。 - Paul建议的方法".{0,10}<原始模式>.{0,10}"
非常好,但高亮颜色常常混乱。我创建了一个类似的脚本,输出相似且颜色得到保留:
#!/bin/bash
# Usage:
# grepl PATTERN [FILE]
# how many characters around the searching keyword should be shown?
context_length=10
# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1))
grep -E --color=always "$1" $2 |
grep --color=none -oE \
".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
grepl
,那么grepl pattern file_with_long_lines
应该显示匹配的行,但只显示匹配字符串周围的10个字符。function grep () {
tput rmam;
command grep "$@";
tput smam;
}
tput rmam
,并在运行之后执行 tput smam
,这样就禁用了换行,然后重新启用了它。ag
还可以使用正则表达式技巧,如果您更喜欢的话:
ag --column -o ".{0,20}error.{0,20}"
ack
是什么?它是当你不喜欢某些东西时使用的命令吗?类似于ack file_with_long_lines | grep pattern
这样的东西? :-) - Alok Singhalack
(在 Debian 上称为ack-grep
)是一种功能强大的grep
工具。它还有一个--thpppt
选项(不是开玩笑的)。更多信息请参考 http://betterthangrep.com/。 - ZoogieZork--thpppt
功能有些争议,但其主要优点似乎在于您可以直接使用 Perl 正则表达式,而不是一些疯狂的[[:space:]]
和像{
、[
等字符,这些字符会随着-e
和-E
开关的变化而改变含义,这种情况很难记住。 - Evgeni Sergeevgrep --color=always | less -S -R
。然后输入-R
来展开/折叠行。 - Jérôme Pouiller