求助,怎么显示一个文件的指定两行

mikkybaby 2020-11-02 04:00:17
一个日志文件如下,我需要读取文件,并输出这样的结果:usr1 命令:AAA 结果成功

执行结果:成功。
XXXX(描述信息)
用户:usr1 执行命令:AAA

执行结果:失败。
XXXX(描述信息)
用户:usr1 执行命令:BBB

现在能通过grep定位到“用户:usr1 执行命令:AAA”的行号,请问怎么获取上两行的执行结果,并且把需要的字段取出来拼成一行呢?
用sed -n '3p;1p' 输出的是先结果,后用户,怎么能颠倒一下呢?谢谢
...全文
42571 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaasssdddd96 2020-12-05
  • 打赏
  • 举报
回复
用C语言,作个格式分析器,可以彻底解决这类问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct record {
char *result;
char *user;
char *command;
} log;

#define BUFSIZE 256
char buffer[BUFSIZE];

int analysis_1(FILE*fp)
{
char *p;
if (fgets(buffer, BUFSIZE, fp)==NULL) {
return 0;
}

for(p =buffer; *p; p++) {
if( *p ==':' ) goto found;
}
return 0;
found:
log.result = ++p;
while(*p) {
if (*p=='.') goto found2;
++p;
}
return 0;
found2:
*p = '\0';
log.result = strdup(log.result);
return 1;
}

int analysis_2(FILE*fp)
{
if (fgets(buffer, BUFSIZE, fp)==NULL) {
return 0;
}
return 1;
}

int analysis_3(FILE*fp)
{
char *p;
if (fgets(buffer, BUFSIZE, fp)==NULL) {
return 0;
}
for(p =buffer; *p; p++) {
if( *p ==':' ) goto found_user;
}
return 0;
found_user:
log.user = ++p;
while(*p) {
if (*p==' ') goto found_user2;
++p;
}
return 0;
found_user2:
*p = '\0';
log.user = strdup(log.user);

for(p++; *p; p++) {
if( *p ==':' ) goto found_command;
}
return 0;
found_command:
log.command = ++p;
while (*p ) {
if (*p=='\n') {
*p = '\0';
break;
}
p++;
}
log.command = strdup(log.command);
return 1;
}


int analysis(FILE*fp)
{
int ok;
ok = analysis_1(fp);
if (!ok) goto error1;
ok = analysis_2(fp);
if (!ok) goto error2;
ok = analysis_3(fp);
if (!ok) goto error3;
return 1;

error1:
if (feof(fp)) return 0;
error2:
error3:
printf("file format error\n");
return 0;
}


int main()
{
FILE *fp;
fp = fopen("result.log", "r");
if(!fp) {
printf("can not open log file\n");
exit(0);
}
while (!feof(fp) ) {
if (analysis(fp) ) {
printf("%s COMMAND:%s RESULT%s\n",
log.user, log.command, log.result);
}
if(log.result) {
free(log.result); log.result=NULL;
}
if(log.user) {
free(log.user); log.user=NULL;
}
if(log.command) {
free(log.command); log.command=NULL;
}
fgets(buffer,BUFSIZE, fp);
}
fclose(fp);
return 0;
}
mikkybaby 2020-11-03
  • 打赏
  • 举报
回复
确实同样的问题,被发现了
weixin_43861456 2020-11-02
  • 打赏
  • 举报
回复
awk '/执行结果/{a=$0;next}{print $0?$0" "a:$0}' a.log|grep "用户"|sed 's/用户://;s/执行命令:/命令:/;s/执行结果:/结果/' 你这个问题跟之前的很像啊,有时间的话可以自己研究一下awk这个工具的使用

1,195

社区成员

发帖
与我相关
我的任务
社区描述
该论坛主要探讨IBM AIX平台的安装、部署、应用开发等话题,并为网友们提供自由交流的平台。
社区管理员
  • IBM AIX社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧