在Linux中获取输出的特定部分
我有一个shell脚本的输出,如下所示:在Linux中获取输出的特定部分,linux,shell,Linux,Shell,我有一个shell脚本的输出,如下所示: today=$(date +'%a %b %d') grep "$today" aaa.sh today=$(date +'%a %b %d') sed -n "/${today}/,$ p" aaa.sh aaa.sh输出 Tue Mar 04 01:00:53 2014 Time drift detected. Please check VKTM trace file for more details. Tue M
today=$(date +'%a %b %d')
grep "$today" aaa.sh
today=$(date +'%a %b %d')
sed -n "/${today}/,$ p" aaa.sh
aaa.sh输出
Tue Mar 04 01:00:53 2014
Time drift detected. Please check VKTM trace file for more details.
Tue Mar 04 07:21:52 2014
Time drift detected. Please check VKTM trace file for more details.
Tue Mar 04 13:17:16 2014
Time drift detected. Please check VKTM trace file for more details.
Tue Mar 04 16:56:01 2014
SQL> ALTER DISKGROUP fra ADD DISK '/dev/rhdisk20'
Wed Mar 05 00:03:42 2014
Time drift detected. Please check VKTM trace file for more details.
Wed Mar 05 04:13:39 2014
Time drift detected. Please check VKTM trace file for more details.
Tue Mar 05 05:56:07 2014
GMON querying group 3 at 10 for pid 18, osid 27590856
GMON querying group 3 at 11 for pid 18, osid 27590856
我需要从今天开始得到零件:
Wed Mar 05 00:03:42 2014
Time drift detected. Please check VKTM trace file for more details.
Wed Mar 05 04:13:39 2014
Time drift detected. Please check VKTM trace file for more details.
Tue Mar 05 05:56:07 2014
GMON querying group 3 at 10 for pid 18, osid 27590856
GMON querying group 3 at 11 for pid 18, osid 27590856
你可以用
tail -n 7 filename
用于获得所需的输出。它基本上会给出名为filename
的文本文件的最后七行
要从今天开始获取解决方案,您可以使用:
k=$(date +"%a %b %d")
g=$(grep -nr "$k" in|cut -f1 -d:|head -1)
total=$(wc -l<in)
l=`expr $total - $g + 1
tail -n$l in
k=$(日期+%a%b%d)
g=$(grep-nr“$k”在|切口-f1-d:|头部-1)
total=$(wc-l我想我有一个简单的解决方案:
获取date
以与文件中的日期匹配的格式输出日期(在格式化选项上选中man date
).由于我们不想匹配时/分/秒,我们必须调用日期
两次:一次用于工作日/月/日的一半,另一次用于完整日期结束时的年半。在这两部分之间,我们将horus/分/秒与*
正则表达式匹配
然后做:
aaa.sh | grep -E '`date --only-weekday-month-day`.*`date --only-year`' -A 999999
虽然我使用的是NewWorld的答案,但可以修改为
将日期的输出转换为与文件格式类似的格式
假设在变量'D'中,您得到了该输出
sed '1,/${D}/d' aaa.sh
将在匹配日期后输出所有行
示例:假设您获得了D=“Wed Mar 05 00:03:42 2014”
输出将按预期进行。请尝试
sed-n'/Wed Mar 05/,$p'aaa.sh
此处-n
表示“除非指定,否则不要打印任何内容”。
将打印与表达式/Wed\Mar\05/匹配的行的第一次出现,直到文件结束(p
)“您可以按如下格式获取日期:
today=$(date +'%a %b %d')
grep "$today" aaa.sh
today=$(date +'%a %b %d')
sed -n "/${today}/,$ p" aaa.sh
然后像这样搜索它:
today=$(date +'%a %b %d')
grep "$today" aaa.sh
today=$(date +'%a %b %d')
sed -n "/${today}/,$ p" aaa.sh
如果今天起有几行没有日期,例如您的GMON行,您可以添加-a
来说明您想要的匹配后有多少行,并使用一个大数字:
grep -A 999999 "$today" aaa.sh
如果您在AIX上,并且没有-A选项,请像这样使用sed:
today=$(date +'%a %b %d')
grep "$today" aaa.sh
today=$(date +'%a %b %d')
sed -n "/${today}/,$ p" aaa.sh
说明:
也就是说,将今天的日期以“Wed Mar 05”的格式存储在变量today
中。然后搜索,不打印任何内容(-n
),直到找到该日期,从该点开始,直到文件结束($
)打印所有行(p
).我不是bash的专业人士。所以我需要一个明确的解决方案。@AloneInTheDarkman awk
或man sed
拥有找到解决方案所需的所有信息。还有man date
。如果你仍然无法解决这个问题,你应该尝试加入这个问题。解决方案是在bash上变得专业一点t确实需要几个小时的阅读,我需要从今天开始的部分。可能会有更多的行。感谢您的解决方案。我还有一个问题,如何在AIX中执行相同的操作?因为语法不同。@AloneInTheDark上述解决方案在模式匹配后打印所有行,它不包括第一行。仅供参考,您可以se sed-n/${D}/,$p“aaa.sh以避免这种情况。如何在AIX中做到这一点?因为其中没有-A参数。我得到一个错误:aaa.sh[10]:Wed:not found.sed:0602-410第一个正则表达式不能为null。我的日期格式如下(“Wed-Mar 05”)请再试一次,我添加了大括号。只是一个友好的建议…您不需要用斜杠来转义空格。而且,当只有一段代码要执行时,您不需要指定-e
,因为sed知道它是什么以及如何处理它。