标签: pattern-matching

解析所有特定长度的字符串?

我已经导出了非常大的 10 年电子邮件存档。

我想解析任何长度为 64 个字符的字符串的所有文本以搜索比特币私钥。

如何解析特定长度的字符串?

text-processing wildcards files pattern-matching

2
推荐指数
3
解决办法
1720
查看次数

匹配模式后提取行中的值

我试图在匹配模式之后提取第 N 行中的值'kappa (ts/tv) ='。我使用 awk 使用了以下命令。

awk '/kappa (ts/tv) =/{print $NF}' text.txt
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误

awk: cmd. line:1: error: Unmatched ( or \(: /kappa (ts/
Run Code Online (Sandbox Code Playgroud)

我也用'sed'得到这个错误。我知道我在这里遗漏了一些关于正则表达式的内容。

任何人都可以提供任何建议吗?

awk pattern-matching

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

打印文本文件中预定义标签之间的部分行

我有一个像下面这样的文件

<g> Good wheatear </g> other parts of line 
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line 
Run Code Online (Sandbox Code Playgroud)

我希望我的输出是这样的:

<g> Good wheatear </g> 
<g> The farm land is to be sold </g>
<g> knock knock </g>
Run Code Online (Sandbox Code Playgroud)

即打印 <g> 和 </g> 标签之间的内容,包括标签

我试过这个命令:

awk '/<s>/, /<\/s>/' trsTest.txt

但它打印了整行。

如何打印标签之间的内容?

linux sed awk pattern-matching

2
推荐指数
3
解决办法
394
查看次数

搜索长字符串(&gt;50 个字符)并记录匹配

我有一段代码,用于查找字符串,然后记录是否匹配。当字符串不超过 50 个字符时,代码工作正常。然而,在此之上,例如对于 100 或 150 个字符的字符串,它仅基于字符串中的前 50 个字符而不是完整的 100/150 个字符进行匹配。

有没有办法确保它根据完整的字符串长度计算匹配项?我正在使用一个awk程序,因为当前的分数基于出生日期并且小于一列,然后是长字符串匹配。

want2=$( awk '{print $4}' temp10_0.txt | head -1 )
dob_want2=$(head -1 year.txt )
awk -v a="$want2" -v b="$dob_want2" '{ if ($1==a && $2<=b) print $0, "1";else print $0, "0"}' temp25_0.txt>  temp11_0.txt
Run Code Online (Sandbox Code Playgroud)
  • 输入数据temp25_0.txt如下
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2016 
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2008  
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2013
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2000
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1987
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 1965
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555150000555555515515551011155111555115155101155511 2000
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555000551511115555555155155511111551115551151551111555 2007
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111150500 2016
    
    Run Code Online (Sandbox Code Playgroud)
  • want2
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511
    
    Run Code Online (Sandbox Code Playgroud)
  • dob_want2
    2019
    
    Run Code Online (Sandbox Code Playgroud)
  • 期望的输出是
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2016 1
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 2008 1  
    51511151511115551515555551111111555115511511111511115151111555151555511115511551511555551555155555555151111555555515515551111155111555115155111155511 …
    Run Code Online (Sandbox Code Playgroud)

awk pattern-matching

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

grep 如何返回不同数量的匹配项?

我需要将一个文件(24 行)grep 成两个文件(有点大)。

原始文件包含与此字符串类似的 24 行:

AATGGACGCTTAAC[A|C|T][A|C|G]CGGC[A|T]TCGGAT
Run Code Online (Sandbox Code Playgroud)

我执行以下操作:

grep -f aList hugeFile_N*.csv | wc -l
4396868
Run Code Online (Sandbox Code Playgroud)

然后,为了仔细检查一切是否正常,我将文件分成两个文件,并通过另一个 grep 使用它们:

cat aList | head -n 12 > firstHalf
cat aList | tail -n +13 > secondHalf
grep -f firstHalf hugeFile_N*.csv | wc -l
2169008
grep -f secondHalf hugeFile_N*.csv | wc -l
2228046
Run Code Online (Sandbox Code Playgroud)

现在,我期望来自两个单独 grepped 文件的匹配总数等于我为原始文件找到的匹配数。但是,正如你所看到的:

2169008 + 2228046 = 4397054
4397054 != 4396868
Run Code Online (Sandbox Code Playgroud)

不是这种情况。我们有 186 场比赛缺失。这里发生了什么?

我还对(实际上非​​常简单的)文件进行了一些调查。在这里,我从两个独立的部分 grep 结果:

grep -f <(cat firstHalf secondHalf) hugeFile_N*.csv > together
Run Code Online (Sandbox Code Playgroud)

然后我分别 grep 两半:

grep …
Run Code Online (Sandbox Code Playgroud)

grep pattern-matching

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

如何否定 Bash 的正则表达式匹配运算符

Bash 有=~正则表达式匹配操作符。下面是一个使用它的例子:

#!/bin/bash

input=$1


if [[ "$input" =~ "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]]
#                 ^ NOTE: Quoting not necessary, as of version 3.2 of Bash.
# NNN-NN-NNNN (where each N is a digit).
then
  echo "Social Security number."
  # Process SSN.
else
  echo "Not a Social Security number!"
  # Or, ask for corrected input.
fi
Run Code Online (Sandbox Code Playgroud)

对于否定,我见过的所有例子都依赖于一个else子句。对于我对否定匹配感兴趣的情况,有没有更好的方法来制作非功能性if子句?

例如,如果我只关心上述输入不是非社会安全号码的情况,那么正确的方法是什么?

bash regular-expression pattern-matching

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

在 case 语句中匹配有效的版本号

我想在case语句中匹配一个版本号。版本号可能如下所示

1.12.0.32
1.12.0.32.1
2.10.0.30.1.2
Run Code Online (Sandbox Code Playgroud)

并存储在一个 shell 变量中:version.

正如我在互联网上搜索的那样,在 -case语句中匹配正则表达式并不困难。但是,有没有人有想法或可以帮助说明如何在case-statement 中完成?

我尝试了以下方法,但没有奏效:

1.12.0.32
1.12.0.32.1
2.10.0.30.1.2
Run Code Online (Sandbox Code Playgroud)

bash regular-expression case pattern-matching

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

为什么“grep -w”匹配后面带有连字符/减号(“-”)的单词?

我需要询问您有关grep在 Debian 中的 Bash 脚本中使用命令的问题。

我有包含以下几行的示例文件:

/fruit-/apple.txt
/fruit-/banana.txt
/fruit-/samples
/vegetables-/carrot.txt
/vegetables-/garlic.txt
Run Code Online (Sandbox Code Playgroud)

我想选择包含 word 的所有行fruit-

我可以调用命令:

grep -w "fruit-" file.txt
Run Code Online (Sandbox Code Playgroud)

输出将是:

/fruit-/apple.txt
/fruit-/banana.txt
/fruit-/samples
Run Code Online (Sandbox Code Playgroud)

但是当我使用命令时:

grep -w "fruit" file.txt
Run Code Online (Sandbox Code Playgroud)

我也得到与上面相同的输出。但这是错误的。输出应该是 0。因为我没有输入-模式。

为什么不正确grep对待-呢?

grep regular-expression pattern-matching

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

使用 AWK 打印第一个模式第一次出现到第二个模式最后一次出现之间的行

我有一个数据文件,日期在第二列

# cat datafile
-;20210106;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;
-;20210221;-;-;*20210219*;
Run Code Online (Sandbox Code Playgroud)

连字符“ -”代表随机文本数据,点“ ”...代表更多行数据,“*”代表同一列中的随机文本。我想要的只是基于第二列之间的20210112数据20210219

我想避免,sed/grep因为两者也会在其他列中 grep 类似的模式。

# sed -n '/20210112/,/20210219/p' datafile
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;
-;20210221;-;-;*20210219*;
Run Code Online (Sandbox Code Playgroud)

它也会匹配其他不相关行中的一些其他文本。所以,我猜 AWK 是一个更好的候选者,但我注意到 awk 仅在第一个模式的第一个匹配到第二个模式的第一个匹配之间打印

# awk -F';' '$2 ~ /20210112/,$2 ~ /20210219/' datafile
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
Run Code Online (Sandbox Code Playgroud)

然而,我想将所有行带到第二个模式的最后一场比赛。

期望的

-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-; …
Run Code Online (Sandbox Code Playgroud)

grep awk text-processing pattern-matching

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

如果程序的输出包含特定单词,则指示 shell 脚本执行任务

我需要在 Bash 中创建一个程序来启动一个命令,检查结果是否包含一个单词,如果包含,则执行一些操作。

示例:我需要检查打印机是否在线

lpstat -p [printer name]
Run Code Online (Sandbox Code Playgroud)

如果结果包含这个词inactive,脚本应该给我发一封邮件。

如何检查程序输出的单词?

bash shell-script pattern-matching

0
推荐指数
1
解决办法
37
查看次数