Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex AWK-基于正则表达式的增值_Regex_Linux_Awk - Fatal编程技术网

Regex AWK-基于正则表达式的增值

Regex AWK-基于正则表达式的增值,regex,linux,awk,Regex,Linux,Awk,我必须在linux中使用awk添加正则表达式返回的数字 基本上来自此文件: 123john456:x:98:98::/home/john123:/bin/bash 我必须使用awk添加数字123和456。 因此结果将是579 到目前为止,我已经做了以下工作: awk-F':''$1~VAR+=“/[0-9].*(=:)/”;{print VAR}'/etc/passwd awk-F':'VAR+=“/[0-9].*(=:)/”;{print VAR}'/etc/passwd awk-F':''

我必须在linux中使用awk添加正则表达式返回的数字

基本上来自此文件:

123john456:x:98:98::/home/john123:/bin/bash
我必须使用awk添加数字
123
456
。 因此结果将是
579

到目前为止,我已经做了以下工作:

awk-F':''$1~VAR+=“/[0-9].*(=:)/”;{print VAR}'/etc/passwd

awk-F':'VAR+=“/[0-9].*(=:)/”;{print VAR}'/etc/passwd

awk-F':''匹配($1,VAR=/[0-9].*?:/);{print VAR}'/etc/passwd

从我所看到的来看,match根本不支持这一点

有人知道吗

更新: 它也应该适用于
john123
result->
123

123john
result->
123

带着呆呆的眼神和给定的示例

awk -F ':' '{a=gensub(/[a-zA-Z]+/,"+", "g", $1); print a}' inputFile | bc
我会做的。 更一般的:

awk -F ':' '{a=gensub(/[a-zA-Z]+/,"+", "g", $1); a=gensub(/^+/,"","g",a); a=gensub(/+$/,"","g",a); print a}' inputFile | bc
正则表达式部分将所有字母序列替换为“+”(例如,“
12johnny34
”变为
12+34
)。最后,此数学运算由
bc
进行评估。
(为了安全起见,我通过
^+
+$
删除了前导和尾随的“+”符号)

,并使用gawk和给定的示例

awk -F ':' '{a=gensub(/[a-zA-Z]+/,"+", "g", $1); print a}' inputFile | bc
我会做的。 更一般的:

awk -F ':' '{a=gensub(/[a-zA-Z]+/,"+", "g", $1); a=gensub(/^+/,"","g",a); a=gensub(/+$/,"","g",a); print a}' inputFile | bc
正则表达式部分将所有字母序列替换为“+”(例如,“
12johnny34
”变为
12+34
)。最后,此数学运算由
bc
进行评估。
(为了安全起见,我删除了由
^+
+$
组成的前导和尾随“+”符号)

您可以使用
[^0-9]+
作为字段分隔符,而将
:[^\n]*\n
作为记录分隔符:

awk -F '[^0-9]+' 'BEGIN{RS=":[^\n]*\n"}{print $1+$2}' /etc/passwd
因此,假设/etc/passwd的内容为:

123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash
这将产生:

579
123
123

您可以将
[^0-9]+
用作字段分隔符,而将
:[^\n]*\n
用作记录分隔符:

awk -F '[^0-9]+' 'BEGIN{RS=":[^\n]*\n"}{print $1+$2}' /etc/passwd
因此,假设/etc/passwd的内容为:

123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash
这将产生:

579
123
123
根据您的最新要求:

$ cat file
123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash

$ awk -F':' '{split($1,t,/[^0-9]+/); print t[1] + t[2]}' file
579
123
123
根据您的最新要求:

$ cat file
123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash

$ awk -F':' '{split($1,t,/[^0-9]+/); print t[1] + t[2]}' file
579
123
123
我使用awk的
split()

split(字符串、目标数组、[regex]、[separator\u数组]*)

*分隔符_数组需要检查

$awk-F:'{split($1,A,/[^0-9]+/,S);print S[1],A[1]+A[2]}'我使用awk的
split()
来分隔任何不包含数字的字符串上的第一个字段

split(字符串、目标数组、[regex]、[separator\u数组]*)

*分隔符_数组需要检查

$awk-F:'{split($1,A,/[^0-9]+/,S);print S[1],A[1]+A[2]}'您可以使用

awk -F ':' '{n=split($1, a, /[^0-9]+/); b=0; for (i=1;i<=n;i++) { b += a[i]; }; print b; }' /etc/passwd
输出:

579
123
详细信息

  • -F':'
    -记录被拆分为带有
    字符的字段
  • n=split($1,a,/[^0-9]+/)
    -获取字段1并拆分为仅限数字的块,保存
    a
    数组中的数字,
    n
    变量包含这些块的数量
  • b=0
    -
    b
    将保存总和
  • 对于(i=1;i您可以使用

    awk -F ':' '{n=split($1, a, /[^0-9]+/); b=0; for (i=1;i<=n;i++) { b += a[i]; }; print b; }' /etc/passwd
    
    输出:

    579
    123
    
    详细信息

    • -F':'
      -记录被拆分为带有
      字符的字段
    • n=split($1,a,/[^0-9]+/)
      -获取字段1并拆分为仅限数字的块,保存
      a
      数组中的数字,
      n
      变量包含这些块的数量
    • b=0
      -
      b
      将保存总和

    • for(i=1;i这里是另一个
      awk
      变体,它将第一个字段中的所有数字相加,并用
      分隔:

      cat file
      123john456:x:98:98::/home/john123:/bin/bash
      john123:x:98:98::/home/john123:/bin/bash
      123john:x:98:98::/home/john123:/bin/bash
      1j2o3h4n5:x:98:98::/home/john123:/bin/bash
      
      awk -F '[^0-9:]+' '{s=0; for (i=1; i<=NF; i++) {s+=$i; if ($i~/:$/) break} print s}' file
      

      下面是另一个
      awk
      变体,它将第一个字段中的所有数字相加,并用
      分隔:

      cat file
      123john456:x:98:98::/home/john123:/bin/bash
      john123:x:98:98::/home/john123:/bin/bash
      123john:x:98:98::/home/john123:/bin/bash
      1j2o3h4n5:x:98:98::/home/john123:/bin/bash
      
      awk -F '[^0-9:]+' '{s=0; for (i=1; i<=NF; i++) {s+=$i; if ($i~/:$/) break} print s}' file
      
      您也可以尝试Perl

      $ cat johnny.txt
      123john456:x:98:98::/home/john123:/bin/bash
      john123:x:98:98::/home/john123:/bin/bash
      123john:x:98:98::/home/john123:/bin/bash
      
      $ perl -F: -lane ' $_=$F[0]; $sum+= $1 while(/(\d+)/g); print $sum; $sum=0 ' johnny.txt
      579
      123
      123
      
      $
      
      您也可以尝试Perl

      $ cat johnny.txt
      123john456:x:98:98::/home/john123:/bin/bash
      john123:x:98:98::/home/john123:/bin/bash
      123john:x:98:98::/home/john123:/bin/bash
      
      $ perl -F: -lane ' $_=$F[0]; $sum+= $1 while(/(\d+)/g); print $sum; $sum=0 ' johnny.txt
      579
      123
      123
      
      $
      


      请在-F选项后添加空格,除此之外,运行该命令将为每行
      (标准中)返回一个错误1:语法错误
      是的,它似乎适用于常规文件,而不是passwd文件。我想这是权限问题。请您简要介绍一下它的工作原理好吗?您应该提到,这只是gensub()的gawk(可能还有一些版本的mawk).@johnyonpc-运行包含某些输入文件但不包含其他文件的脚本时,不会出现语法错误。请在-F选项后添加空格,除此之外,运行命令将为每行
      返回一个错误(标准中)1:语法错误
      是的,它似乎适用于常规文件,而不是passwd文件。我想这是权限问题。请您简要介绍一下它的工作原理好吗?您应该提到,这只是gensub()的gawk(可能还有一些版本的mawk)@JohnnyOnPc-在使用某些输入文件而不是其他文件运行脚本时,不会出现语法错误。您正在尝试在支持ERE的工具中使用PCRE regexp。请参见
      awk-F':“{n=split($1,a,/[^0-9]+/);b=0;有关详细信息,请参阅(i=1;iSo,可以有任意数量的数字吗?只是想知道,但这有什么用?您正在尝试在支持ERE的工具中使用PCRE regexp。请参见
      awk-F':“{n=split($1,a,/[^0-9]+/);b=0;例如(i=1;iSo,可以有任意数量的数字吗?只是想知道,但这有什么用?这只适用于前后都有数字的情况,用户名为“123john312”,不适用于用户名不包含任何数字的情况。或者只有前后都有数字的情况,等等。谢谢您的回答ou。您应该提到,多字符RS需要GNU awk。这只适用于用户名“123john312”前后有一个数字的情况,不适用于用户名不包含任何数字的情况。或者当用户名后面有一个数字或之前有一个数字的情况,等等。谢谢您的回答。您应该提到这需要GNU awk用于多字符RS.@EdMorton,接得好。有一次我没有运行原始awk,我被西方最快的awk调用了。@EdMorton,Goo