我有一个大约1000行的文件.我希望我的文件的一部分在与我的grep语句匹配的行之后.
即
$ cat file | grep 'TERMINATE' # It is found on line 534
Run Code Online (Sandbox Code Playgroud)
所以,我希望该行文件__CODE__可以进一步处理.
我该怎么做 ?
我想在文件中搜索一个模式,并在找到该模式后打印5行.
我需要使用awk才能做到这一点.
例:
文件内容:
.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
Run Code Online (Sandbox Code Playgroud)
如何解析文件并仅打印上述行?我是否使用包含"PATTERN"的行的NR并继续增加到5并在此过程中打印每一行.如果在Awk中有任何其他有效的扫描仪,请告诉我.
今天我在网上搜索命令,在模式后打印下两行,我遇到了一个我无法理解的awk命令.
$ /usr/xpg4/bin/awk '_&&_--;/PATTERN/{_=2}' input
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
注意:这不是任何现有问题的重复,它旨在说明为什么这样一个极其常见且看似简单的问题无法回答,并提供有关发布此类问题的人如何修改它们以使其可回答的指导,因此我们不必几乎每天都在评论中提供相同的指导,并且可以参考这个。
给定以下输入文件:
foo
o.b
bar
Run Code Online (Sandbox Code Playgroud)
我需要输出与模式匹配的所有行,o.b因此我的预期输出是:
o.b
Run Code Online (Sandbox Code Playgroud)
我已经尝试过,awk '"o.b"' file但是输出所有行(添加这部分是为了避免抱怨没有在问题中发布尝试的解决方案)。
使用grep,您可以打印与您的搜索查询匹配的行。添加一个-C选项将打印两行周围的上下文,如下所示:
> grep -C 2 'lorem'
some context
some other context
**lorem ipsum**
another line
yet another line
Run Code Online (Sandbox Code Playgroud)
同样,您可以使用grep -B 2或grep -A 2分别打印前两行或后两行的匹配行,例如:
> grep -A 2 'lorem'
**lorem ipsum**
another line
yet another line
Run Code Online (Sandbox Code Playgroud)
是否可以跳过匹配的行并只打印上下文?具体来说,我只想打印匹配项上方 2 行的行,如下所示:
> <some magic command>
some context
Run Code Online (Sandbox Code Playgroud) 我有一个文件中的id列表和一个数据文件(大小约为3.2Gb),我想提取数据文件中包含id和下一行的行.我做了以下事情:
grep -A1 -Ff file.ids file.data | grep -v "^-" > output.data
Run Code Online (Sandbox Code Playgroud)
这有效,但也提取了不需要的子串,例如,如果id EA4也被拉出线EA40.
所以我尝试使用相同的命令,但将-w(--word-regexp)标志添加到第一个grep以匹配整个单词.但是,我发现我的命令现在运行了> 1小时(而不是~26秒),并且还开始使用10千兆字节的内存,所以我不得不杀死这份工作.
为什么添加-w使命令如此缓慢和内存占用?如何有效地运行此命令以获得所需的输出?谢谢
file.ids 看起来像这样:
>EA4
>EA9
Run Code Online (Sandbox Code Playgroud)
file.data 看起来像这样:
>EA4 text
data
>E40 blah
more_data
>EA9 text_again
data_here
Run Code Online (Sandbox Code Playgroud)
output.data 看起来像这样:
>EA4 text
data
>EA9 text_again
data_here
Run Code Online (Sandbox Code Playgroud) sed应该在匹配模式后处理多个命令 ,这些命令在{cmd1;cmd2;cmd3}等大括号中给出。但是在下面给定的代码中,d(elite) 之后的所有命令都将被忽略。
脚本文件
s/^\(interface GigabitEthernet0\)$/\1\/0/
/interface GigabitEthernet0\/0$/{
n # process next line = 1st line (after match) to be deleted
d # Should delete '1st line (after match) to be deleted'
n # process next line = 2nd line to be altered
s/2nd line to be altered/2ND LINE AFTER ALTERATION/
n
s/3rd line to be altered/3RD LINE AFTER ALTERATION/
}
Run Code Online (Sandbox Code Playgroud)
输入文件
interface GigabitEthernet0
1st line (after match) to be deleted
2nd line to …Run Code Online (Sandbox Code Playgroud) 我想提取使用匹配模式之后的第N行grep,awk或sed.
例如,我有这段文字:
Revision:
60000<br />
Run Code Online (Sandbox Code Playgroud)
我想提取60000.
我尝试过Revision:([a-z0-9]*)\s*([0-9]){5}将修订版与修订版号一起匹配,但是当我将它传递给grep时:grep Revision:([a-z0-9]*)\s*([0-9]){5} file.html我什么都没得到.
我怎样才能做到这一点?
我有一个字符序列的文本文件,由两行组成:标题和下一行中的序列本身。该文件的结构如下:
>header1
aaaaaaaaa
>header2
bbbbbbbbbbb
>header3
aaabbbaaaa
[...]
>headerN
aaabbaabaa
Run Code Online (Sandbox Code Playgroud)
在另一个文件中,我有一个要删除的序列标题列表,如下所示:
>header1
>header5
>header12
[...]
>header145
Run Code Online (Sandbox Code Playgroud)
这个想法是从第一个文件中删除这些序列,因此所有这些标头+以下行。我使用 sed 执行此操作,如下所示,
while read line; do sed -i "/$line/,+1d" first_file.txt; done < second_file.txt
Run Code Online (Sandbox Code Playgroud)
它可以工作,但需要很长时间,因为我使用 sed 多次加载整个文件,而且它很大。关于如何加快这个过程的任何想法?
我正在尝试使用 删除范围sed。范围来自已知的匹配和接下来的两行。假设我想删除以 开头的所有行Don't,然后删除后面的 2 行。
请注意,我还在 sed 命令文件中进行替换。因此,我避免在我的解决方案空间中使用-nand /p。
无论出于何种原因,我想将自己限制为一次 sed 调用。
这是我的数据(data.txt):
Print Me
Please Output This line
Don't Print Me and 2 more lines
This line is no good
So is this one
We should see this line
And this one, too.
Run Code Online (Sandbox Code Playgroud)
这是我的预期输出:
Print Me
Please Output This line
We should see this line
And this one, too.
Run Code Online (Sandbox Code Playgroud)
这是一个尝试:
sed -f delete_dont_plus_2.sed data.txt
Run Code Online (Sandbox Code Playgroud)
以此为delete_dont_plus_2.sed:
/^Don't/,+2d
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
sed: 1: delete_dont_plus_2.sed: …Run Code Online (Sandbox Code Playgroud) 我目前正在玩sed来获取两行之间的内容.我有一个很好的教程:http://www.cyberciti.biz/faq/unix-linux-sed-print-only-matching-lines-command/
在本教程中,我发现:
sed -n -e '/regexpA/,/regexpB/p' input.file
Run Code Online (Sandbox Code Playgroud)
上面的命令将同时打印匹配的线条regexpA和regexpB,但我会想逃离这两条线段,说这两个匹配线将无法打印到STDOUT,有没有漂亮的解决方案吗?
提前致谢.
我有一个类似以下的列表:
Name_JR_1
1.1.1.1
Name_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3
Run Code Online (Sandbox Code Playgroud)
如果要使用以下数字语法选择所有关联的名称,则可以查找模式并使用该-A1选项打印匹配的行以及after上下文或下一行,如下所示:
grep "JR" -A1 file_name
这将打印我想要的:
Name_JR_1
1.1.1.1
Run Code Online (Sandbox Code Playgroud)
但是,我需要一种解决方案,可以删除所有与搜索模式匹配的条目。但是,使用-v带有此语法的选项不会给我想要的结果:
grep -v "JR" -A1 file_name
Run Code Online (Sandbox Code Playgroud)
我希望此命令后的输出如下所示:
Names_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3.
Run Code Online (Sandbox Code Playgroud) 有一个命令给我一个很长的输出。我只想提取其中的一行。该行发生变化,但所需行之前的两行始终相同。如何仅通过搜索前一行来提取这一行:命令输出示例如下:
foo-bar blahblah
===============
foo bar foo bar foo bar.
this string is always the same (search string)
===============
the desired line is here
==========
foofoofoo
==========
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了
awk '/this string is always the same/{p=1} NF{out=$2} END{if(p==1){print out}}'
Run Code Online (Sandbox Code Playgroud)
没有 if 部分但它不起作用
我需要的结果是这样的:
the desired line is here
Run Code Online (Sandbox Code Playgroud)