如何截断grep或ack返回的长匹配行
我想在通常有很长行的HTML文件上运行ack或grep。我不想看到很长的线反复缠绕。但我确实希望看到一条长线的那一部分,它围绕着一个与正则表达式匹配的字符串。如何使用Unix工具的任何组合来实现这一点?您可以使用grep选项如何截断grep或ack返回的长匹配行,grep,unix,ack,Grep,Unix,Ack,我想在通常有很长行的HTML文件上运行ack或grep。我不想看到很长的线反复缠绕。但我确实希望看到一条长线的那一部分,它围绕着一个与正则表达式匹配的字符串。如何使用Unix工具的任何组合来实现这一点?您可以使用grep选项-o,可能还可以将模式更改为“{0,10}.{0,10}”,以查看相关上下文: -o, --only-matching Show only the part of a matching line that matches PATTERN. 通过cu
-o
,可能还可以将模式更改为“{0,10}.{0,10}”
,以查看相关上下文:
-o, --only-matching
Show only the part of a matching line that matches PATTERN.
通过
cut
导入结果。我也在考虑添加一个--cut
开关,这样你就可以说--cut=80
,并且只得到80列。你可以用较少的内容作为ack的寻呼机并切掉长行:ack--pager=“less-S”
这会保留长行,但只保留一行而不是换行。要查看该行的更多内容,请使用箭头键向左/向右滚动至更少内容
我为ack设置了以下别名以执行此操作:
alias ick='ack -i --pager="less -R -S"'
摘自:
建议的方法“{0,10}.{0,10}”非常好,只是突出显示的颜色经常弄乱。我创建了一个具有类似输出的脚本,但颜色也保留了下来:
#/bin/bash
#用法:
#grepl模式[文件]
#搜索关键字周围应显示多少个字符?
上下文长度=10
#颜色的控制字符的长度是多少
#匹配字符串?
#这主要由环境变量GREP_COLORS决定。
control|u length_before=$($(echo a | grep--color=始终a | cut-da-f'1'| wc-c)-1))
control|u length_after=$($(echo a | grep--color=始终a | cut-da-f'2'| wc-c)-1))
grep-E--color=始终为“$1”$2|
grep--color=none-oE\
“{0,$($control_length_before+$context_length))}$1.{0,$($control_length_before+$context_length))}”
假设脚本保存为grepl
,则带有长行的grepl模式文件应显示匹配行,但匹配字符串周围只有10个字符
cut -c 1-100
获取从1到100的字符。我将以下内容放入我的.bashrc
:
grepl() {
$(which grep) --color=always $@ | less -RS
}
然后,您可以在命令行中将grepl
与grep
可用的任何参数一起使用。使用箭头键查看较长线条的尾部。使用q
退出
说明:
grepl(){
:定义将在每个(新)bash控制台中可用的新函数
$(哪个grep)
:获取grep
的完整路径(Ubuntu为grep
定义了一个别名,相当于grep--color=auto
。我们不需要这个别名,只需要原始的grep
)
--color=always
:为输出着色。(--color=auto
来自别名的将不起作用,因为grep
检测到输出被放入管道中,然后不会对其着色。)
$@
:将给定给grepl
函数的所有参数放在此处
less
:使用less
-R
:显示颜色
S
:不要打断长行
以下是我的工作:
function grep () {
tput rmam;
command grep "$@";
tput smam;
}
在我的.bash_配置文件中,我对其进行grep,使其在之前和之后自动运行tputrmam
,这将禁用包装,然后重新启用它。grep-oE.\{0,10\}错误。\{0,10\}mylogfile.txt
在不能使用-E
的异常情况下,请使用小写的-E
说明:
ag
如果您愿意,也可以使用正则表达式技巧:
ag --column -o ".{0,20}error.{0,20}"
什么是ack
?当你不喜欢某样东西时,它是你使用的一个命令吗?像是ack file\u长行| grep模式
?:-)@Alokack
(Debian上称为ack grep
)是grep
类固醇。它还有--thpppt
选项(不是开玩笑)。谢谢。我今天学到了一些东西。虽然--thpppt
功能有点争议,但关键的优势似乎是您可以直接使用Perl正则表达式,而不是一些疯狂的[[:space:]
和{
,[
,等等。用-e
和-e
来改变意思,以一种不可能记住的方式切换。类似的:如果匹配的部分不在前80个字符中怎么办?FWIW我在grep中附加了| cut=c1-120
,对我来说很有用(尽管我不知道如何剪切匹配的文本)|cut=c1-120
对我不起作用,我需要做|cut-c1-120
我认为@edib在语法上是准确的|cut-c1-100
@AndyLester:那一个--没有使用$COLUMNS
的wrap
选项呢?例如:grep-oE.{0,20}mysearchstring.{0,20}myfileyou应该将答案更改为添加-E选项,如@Renaud所示(扩展模式选项),否则用于扩展上下文的建议模式将不起作用。可能不需要这样做,但这里有一个示例:$echo“eeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq。{0,20}MYSTRING.{0,20}./fileonelongline.txt
打印QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ字符串,因为整个过程都变成了搜索模式。我希望找到一种方法,在搜索结果周围保留一些未突出显示的上下文,以便更轻松地进行视觉扫描和结果解释。哦,这里有一个解决使用-oE.{0,x}foo.{0,x}”
方法引起的突出显示问题的方法(其中x
是上下文的字符数)--在末尾附加“| grep foo”。适用于ack或grep solut
ag --column -o ".{0,20}error.{0,20}"