Regex AWK-基于正则表达式的增值
我必须在linux中使用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':''
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