Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Bash脚本:在sed中使用变量/参数_Bash_Sed - Fatal编程技术网

Bash脚本:在sed中使用变量/参数

Bash脚本:在sed中使用变量/参数,bash,sed,Bash,Sed,我正在尝试编写一个小bash脚本,您可以在其中指定分钟数,它将显示最后X分钟的日志文件行。 为了获得线路,我使用sed sed -n '/time/,/time/p' LOGFILE 在CLI上,这可以完美地工作,但在我的脚本中,它不能 # Get date now=$(date "+%Y-%m-%d %T") # Get date minus X number of minutes -- $1 first argument, minutes then=$(date -d "-$1 minu

我正在尝试编写一个小bash脚本,您可以在其中指定分钟数,它将显示最后X分钟的日志文件行。 为了获得线路,我使用sed

sed -n '/time/,/time/p' LOGFILE
在CLI上,这可以完美地工作,但在我的脚本中,它不能

# Get date
now=$(date "+%Y-%m-%d %T")

# Get date minus X number of minutes -- $1 first argument, minutes
then=$(date -d "-$1 minutes" +"%Y-%m-%d %T")

# Filter logs -- $2 second argument, filename
sed -n '/'$then'/,/'$now'/p' $2
我尝试过不同的方法,但似乎都不管用:

result=$(sed -n '/"$then"/,/"$now"/p' $2)
sed -n "/'$then'/,/'$now'/p" "$2"
sed -n "/$then/,/$now/p" $2
sed -n "/$then/,/$now/p" "$2
有什么建议吗? 我在Debian 5上,
echo$SHELL
/bin/sh

编辑:脚本不生成输出,因此不会显示错误。
在日志文件中,每个条目都以这样的日期开头,不要用嵌套的引号引自己头疼。使用
-v
选项和
awk
将shell变量的值传递到脚本中:

#!/bin/bash

# Get date
now=$(date "+%Y-%m-%d %T")

# Get date minus X number of minutes -- $1 first argument, minutes
delta=$(date -d "-$1 minutes" +"%Y-%m-%d %T")

# Filter logs -- $2 second argument, filename
awk -v n="$now" -v d="$delta" '$0~n,$0~d' $2

也不要使用shell内置的变量名,即
then

我假设主要问题是您试图通过字符串匹配执行算术比较
sed-n'/23/,/27/p'
提供包含
23
的第一行和包含
27
的下一行之间的行(然后再次从包含
23
的下一行到包含
27
的下一行,依此类推)。它不会给出所有包含23到27之间的数字的行。如果输入看起来像

19
22
24
26
27
30
它不输出任何内容(因为没有
23
)。使用字符串匹配的awk解决方案也有同样的问题。因此,除非日志文件中逐字出现
then
date字符串,否则您的方法将失败。您必须将日期字符串转换为数字(删除
-
),然后使用算术比较而不是字符串匹配来检查生成的数字是否在正确的范围内。这超出了sed的能力范围;awk和perl可以很容易地完成这项工作。下面是一个perl解决方案:

#!/bin/bash

NOW=$(date "+%Y%m%d%H%M%S")
THEN=$(date -d "-$1 minutes" "+%Y%m%d%H%M%S")

perl -wne '
  if (m/^(....)-(..)-(..) (..):(..):(..)/) {
    $date = "$1$2$3$4$5$6";
    if ($date >= '"$THEN"' && $date <= '"$NOW"') {
      print;
    }
  }' "$2"
#/bin/bash
现在=$(日期“+%Y%m%d%H%m%S”)
然后=$(日期-d“-$1分钟”+%Y%m%d%H%m%S)
perl-wne'
如果(m/^(..)-(..)-(..)(..):(..)/){
$date=“$1$2$3$4$5$6”;

如果($date>=“$THEN”&&&$date您可以显示日志中的一行吗?我已修复了小的打字错误(
-v
,而不是
=v
),不幸的是,这也不会产生任何输出。很好。请尝试调试该问题,然后添加
echo“$now$delta”
在脚本中,检查格式是否与日志文件中的格式匹配。嗯,这是正确的提示。由于我正在奥尔尼检查HH:MM:SS,并且日志是HH:MM:SS,MS,脚本没有找到任何内容。我将脚本调整为
sed-n/$then*/,/$now*/p”$2
。我不知道如何正确地调整awk命令,但一旦调整,它也应该工作。
HH:MM:SS
HH:MM:SS,MS
的子字符串,所以这不能解释它?嗯……你是对的,它不工作……即使它曾经工作过一次。就像我在第一篇文章中写的,日志格式是
2013-05-15 14:21:42794
foll由于空格和日志信息,脚本的格式是
2013-05-15 14:21:42
。好吧,这是可行的。很遗憾,它不能用shell工具解决这个问题。你也可以使用
sed-e's/^\(…\)-(…\)-(…\):(…\):(…\)/\1\2\3\4\6/'“$2”;$awk'$1>“$then”&$1