是否将两个bash循环结果值输出到同一行?

是否将两个bash循环结果值输出到同一行?,bash,Bash,我有一个日志文件保存在我的计算机上,我想创建一个脚本来解析它。我的目标是从日志文件的每一行提取两个值,然后在同一行上彼此相邻(可能以连字符分隔)地输出它们,然后对日志中的每一行进行迭代。例如,以下日志: 123-abc-thething01, 6, 1234, metadata, metadata, email1@email.com, metadata, 123abc 123-abc-thething02, 6, 1234, metadata, metadata, email2@email.co

我有一个日志文件保存在我的计算机上,我想创建一个脚本来解析它。我的目标是从日志文件的每一行提取两个值,然后在同一行上彼此相邻(可能以连字符分隔)地输出它们,然后对日志中的每一行进行迭代。例如,以下日志:

123-abc-thething01, 6, 1234, metadata, metadata, email1@email.com, metadata, 123abc
123-abc-thething02, 6, 1234, metadata, metadata, email2@email.com, metadata, 123abc
123-abc-thething03, 6, 1234, metadata, metadata, email3@email.com, metadata, 123abc
运行脚本后,希望能够实现

123-abc-thething01 - email1@email.com
123-abc-thething02 - email2@email.com
123-abc-thething03 - email3@email.com
目前,我有下面的代码,它正在提取正确的值,但是它只是简单地输出所有的“var1”,然后输出所有的“var2”,如下图所示,而不是逐行进行,在一行上为行1输出var1和var2值,然后在新行E.T.C上为行2输出var1和var2

123-abc-thething01 123-abc-thething02 123-abc-thething03
email1@email.com email2@email.com email3@email.com
我花了一些时间尝试不同的方法,但我有点困惑。我现在对bash不是很了解,所以非常感谢您的帮助。谢谢

#!/bin/bash

for i in logfile.txt
do
   var1=$(cat logfile.txt | awk '{print $1}' | sed 's/,//g')
   var2=$(cat logfile.txt | grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*')
done

echo ${var1}
echo ${var2}
使用
awk

awk -F', ' '{printf "%s - %s\n", $1, $6}' log.file
使用
awk

awk -F', ' '{printf "%s - %s\n", $1, $6}' log.file
对于bash:

#!/bin/bash

while IFS="," read -r -a array
do
  # remove leading white space from element 5
  echo "${array[0]} - ${array[5]/# /}"
done < logfile.txt
#/bin/bash
而IFS=“,”则读取-r-a数组
做
#删除元素5的前导空白
回显“${array[0]}-${array[5]/#/}”
完成
输出:

123-abc-thething01 - email1@email.com 123-abc-thething02 - email2@email.com 123-abc-thething03 - email3@email.com 123-abc-THING01-email1@email.com 123-abc-THING02-email2@email.com 123-abc-THING03-email3@email.com 如果可能,请将awk用于此作业。

与bash一起使用:

#!/bin/bash

while IFS="," read -r -a array
do
  # remove leading white space from element 5
  echo "${array[0]} - ${array[5]/# /}"
done < logfile.txt
#/bin/bash
而IFS=“,”则读取-r-a数组
做
#删除元素5的前导空白
回显“${array[0]}-${array[5]/#/}”
完成
输出:

123-abc-thething01 - email1@email.com 123-abc-thething02 - email2@email.com 123-abc-thething03 - email3@email.com 123-abc-THING01-email1@email.com 123-abc-THING02-email2@email.com 123-abc-THING03-email3@email.com

如果可能,请使用awk来完成此工作。

您不应该使用shell脚本来解析文本文件,例如,这可以仅使用awk
awk-F,{print$1“-“$6}”文件来完成。
鉴于您的更新要求,您也可以使用perl
perl-ne'print“$1-$2\n”If/([^,]+).*([[:alnum:].++.[:alnum:]++[:alnum:]++[:alnum:][:alnum:].+.+.[:alnum:].[:alnum:]+])/”
谢谢!这很方便,我想我会使用这种方法。你不应该使用shell脚本来解析文本文件,例如,这可以只使用awk
awk-F,{print$1“-“$6}”文件来完成。鉴于你更新的需求,你也可以使用perl
perl-ne'print“$1-$2\n”if/([^,]+).*([[:alnum:.+.[:alnum:]+++[:alnum:.[:alnum:][-]+]/“
谢谢!这将在$6之前有一个额外的空间这将在$6之前有一个额外的空间Hi Cyrus,谢谢你的帮助!我应该提到,电子邮件地址可以在每个日志行中的任何位置,而不仅仅是位置5(我的错)。这就是我想使用正则表达式的原因,但是在这种情况下你会有什么建议吗?谢谢您为什么要将简短高效的awk脚本更改为while read循环?@Dronzil电子邮件地址中唯一可以与正则表达式可靠匹配的部分是
@
。您在电子邮件正则表达式中输入的任何其他内容都有可能在有效地址上失败。如果这是在处理用户提交的真实地址,那么您确实需要另一种方法来跟踪地址所在的字段。@ccarton您不认为您可以与regex匹配的电子邮件地址是什么?@123:hek2mgl已经展示了一个awk解决方案(这是我的),并且问题被标记为bash。嗨,Cyrus,谢谢您的帮助!我应该提到,电子邮件地址可以在每个日志行中的任何位置,而不仅仅是位置5(我的错)。这就是我想使用正则表达式的原因,但是在这种情况下你会有什么建议吗?谢谢您为什么要将简短高效的awk脚本更改为while read循环?@Dronzil电子邮件地址中唯一可以与正则表达式可靠匹配的部分是
@
。您在电子邮件正则表达式中输入的任何其他内容都有可能在有效地址上失败。如果这是在处理用户提交的真实地址,那么您确实需要另一种方法来跟踪地址所在的字段。@ccarton您认为哪一个电子邮件地址不能与regex匹配?@123:hek2mgl已经显示了一个awk解决方案(这是我的),并且问题用bash标记。