Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Shell 使用awk处理多行变量,打印符合条件的未修改行_Shell_Unix_Awk_Sed_Posix - Fatal编程技术网

Shell 使用awk处理多行变量,打印符合条件的未修改行

Shell 使用awk处理多行变量,打印符合条件的未修改行,shell,unix,awk,sed,posix,Shell,Unix,Awk,Sed,Posix,我有一个包含多行文件内容的变量。变量由大量命令(awk,sed,…)解析,这些命令充当变量的过滤器和后处理器 echo "$variable" | awk1 | sed1 | awk2 问题不是处理本身,而是我在处理过程中修改了行,丢失了变量的原始值。问题在于,最终的awk执行条件检查,根据结果返回原始变量或不返回原始变量。这就是我的问题所在 我认为用echo之后的原始行创建这个变量是个好主意,但是我在下面的子shell中继承它的任何尝试都失败了。 解决方案必须是可移植的(符合POSIX标准)

我有一个包含多行文件内容的变量。变量由大量命令(
awk
sed
,…)解析,这些命令充当变量的过滤器和后处理器

echo "$variable" | awk1 | sed1 | awk2
问题不是处理本身,而是我在处理过程中修改了行,丢失了变量的原始值。问题在于,最终的
awk
执行条件检查,根据结果返回原始变量或不返回原始变量。这就是我的问题所在

我认为用echo之后的原始行创建这个变量是个好主意,但是我在下面的子shell中继承它的任何尝试都失败了。 解决方案必须是可移植的(符合POSIX标准)

变量的格式:

John Smith - - [21/Mar/2017:09:24:33 +0100] Physics 
Adam Miller - - [22/Feb/2019:09:24:33 +0100] Chemistry 
我想将此文件中的日期与
YYYYMMDDHHMMSS
格式的给定日期进行比较(例如201801151515),如果一行包含日期之后,我想打印整行

到目前为止,我的代码是:

date_after="19960101151515"
process=$(echo "$variable" |awk -F' - - ' '{print $2}' | sed "s/Jan/01/; s/Feb/02/;
    s/Mar/03/; s/Apr/04/; s/May/05/; s/Jun/06/; s/Jul/07/;
    s/Aug/08/; s/Sep/09/; s/Oct/10/; s/Nov/11/; s/Dec/12/" | awk -F'[/:\\[ ]' -v date="$date_after" '{b=$4$3$2$5$6$7; if (b > date) {print $0}}')

sed
awk
grep
cut
。。。通常可以用单个
awk
替换。这还允许您存储原始数据并根据条件返回。 您可以很容易地看到以下
awk
进行了您感兴趣的转换(第一个awk和sed)

因此,现在您可以插入条件on
t
,并在需要时返回原始的
$0

awk -v d="$date_after" '
     { t=$0
       match(t,"\\["); t=substr(t,RSTART+1)
       match(t," ")  ; t=substr(t,1,RSTART-1); split(t,a,"[/:]")
       day=a[1]; year=a[3]; hhmmss=a[4]a[5]a[6]; 
       month=sprintf("%02d",(match("JanFebMarAprMayJunJulAugSepOctNovDec",a[2])+2)/3)
     }
     (t > d) { print $0 }'

基于:

欢迎使用堆栈溢出。你的问题听起来很有趣,但我们希望看到你期望的一个最小的例子。sed和awk表达式不需要与原始代码中的表达式完全相同,但要简单一些,这样我们就可以看到“condition”的含义,并理解返回值是什么。总的来说,mee觉得整个问题可以用一个简单的awk解决方案来解决。还有,这闻起来有点像@kvantour,我加了一个example@lowcase_m我补充了一个答案
awk -v d="$date_after" '
     { t=$0
       match(t,"\\["); t=substr(t,RSTART+1)
       match(t," ")  ; t=substr(t,1,RSTART-1); split(t,a,"[/:]")
       day=a[1]; year=a[3]; hhmmss=a[4]a[5]a[6]; 
       month=sprintf("%02d",(match("JanFebMarAprMayJunJulAugSepOctNovDec",a[2])+2)/3)
     }
     (t > d) { print $0 }'