相关疑难解决方法(0)

如何在匹配grep表达式的行之后获取文件的一部分?(第一场比赛)

我有一个大约1000行的文件.我希望我的文件的一部分在与我的grep语句匹配的行之后.

$ cat file | grep 'TERMINATE'     # It is found on line 534
Run Code Online (Sandbox Code Playgroud)

所以,我希望该行文件__CODE__可以进一步处理.

我该怎么做 ?

bash shell scripting grep

163
推荐指数
7
解决办法
19万
查看次数

如何使用awk在文件中的模式后打印5个连续行

我想在文件中搜索一个模式,并在找到该模式后打印5行.

我需要使用awk才能做到这一点.

例:

文件内容:

.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
Run Code Online (Sandbox Code Playgroud)

如何解析文件并仅打印上述行?我是否使用包含"PATTERN"的行的NR并继续增加到5并在此过程中打印每一行.如果在Awk中有任何其他有效的扫描仪,请告诉我.

unix shell awk

41
推荐指数
5
解决办法
8万
查看次数

解释awk命令

今天我在网上搜索命令,在模式后打印下两行,我遇到了一个我无法理解的awk命令.

$ /usr/xpg4/bin/awk '_&&_--;/PATTERN/{_=2}' input
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

unix awk

17
推荐指数
4
解决办法
2658
查看次数

如何找到与模式匹配的文本?

注意:这不是任何现有问题的重复,它旨在说明为什么这样一个极其常见且看似简单的问题无法回答,并提供有关发布此类问题的人如何修改它们以使其可回答的指导,因此我们不必几乎每天都在评论中提供相同的指导,并且可以参考这个。

给定以下输入文件:

foo
o.b
bar
Run Code Online (Sandbox Code Playgroud)

我需要输出与模式匹配的所有行,o.b因此我的预期输出是:

o.b
Run Code Online (Sandbox Code Playgroud)

我已经尝试过,awk '"o.b"' file但是输出所有行(添加这部分是为了避免抱怨没有在问题中发布尝试的解决方案)。

awk

11
推荐指数
1
解决办法
272
查看次数

使用 grep 仅打印上下文

使用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 2grep -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)

bash shell awk grep

7
推荐指数
1
解决办法
1431
查看次数

使用-w(--word-regexp)标志为什么grep如此缓慢和内存密集?

我有一个文件中的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)

unix bash shell awk grep

6
推荐指数
1
解决办法
1369
查看次数

SED 在 d(elete)、a(ppend) 或 c(hange) 之后不处理 {} 中的多个命令

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)

awk sed

5
推荐指数
1
解决办法
80
查看次数

匹配模式后提取第N行

我想提取使用匹配模式之后的第N行grep,awksed.

例如,我有这段文字:

      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我什么都没得到.

我怎样才能做到这一点?

regex awk grep sed

4
推荐指数
2
解决办法
7131
查看次数

从 fasta 文件中删除多个序列

我有一个字符序列的文本文件,由两行组成:标题和下一行中的序列本身。该文件的结构如下:

>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 多次加载整个文件,而且它很大。关于如何加快这个过程的任何想法?

bash awk sed fasta

3
推荐指数
1
解决办法
4809
查看次数

SED:匹配后删除 X 行

我正在尝试使用 删除范围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)

macos sed

3
推荐指数
1
解决办法
1847
查看次数

如何使用sed获取两行之间的内容,但两条匹配的行被转义

我目前正在玩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)

上面的命令将同时打印匹配的线条regexpAregexpB,但我会想逃离这两条线段,说这两个匹配线将无法打印到STDOUT,有没有漂亮的解决方案吗?

提前致谢.

bash sed

2
推荐指数
1
解决办法
63
查看次数

使用-v选项以grep -A反转多行grep结果

我有一个类似以下的列表:

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)

linux grep text-processing

2
推荐指数
1
解决办法
178
查看次数

使用 grep 或 AWK 在搜索到的字符串后提取一行

有一个命令给我一个很长的输出。我只想提取其中的一行。该行发生变化,但所需行之前的两行始终相同。如何仅通过搜索前一行来提取这一行:命令输出示例如下:

  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)

awk grep

-2
推荐指数
1
解决办法
337
查看次数

标签 统计

awk ×9

grep ×6

bash ×5

sed ×5

shell ×4

unix ×3

fasta ×1

linux ×1

macos ×1

regex ×1

scripting ×1

text-processing ×1