Shell-awk如何使用shell中的命令?

UI设计界面 UI设计界面 主题:1059 回复:2190

Shell-awk如何使用shell中的命令?

归属感 发布于 2017-06-15 字数 225 浏览 1068 回复 3

想从apache的访问日志里面提取时间字段,但是apache日志里面时间的格式是04/Aug/2012:14:22:27 +0800
这种格式的,但是我想把这个日期转换成2012-08-04 14:22:27的格式,在shell中好实现,但是在awk里面怎么使用shell的date方法?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

清晨说ぺ晚安 2017-10-07 3 楼

awk可以用getline或system来调用shell的命令

echo Sun Jan 03 23:54:45 2010|awk '{system("date -d ""$0"" +%Y%m%d")}'

先把日志里的时间处理一下,比如:

echo "04/Aug/2012"|sed -r 's#(..)/(...)/(.*)#2 1 3#' | awk '{system("date -d ""$0"" +%F")}'

偏爱自由 2017-07-10 2 楼

可以实现的,只需要awk配合date即可:

 $ echo 04/Aug/2012:14:22:27 +0800 | awk '{gsub("/", " ");sub(":", " ");printf("date -d"%s" %s" "%sn", $0, "+%Y-%m-%d", "%H:%M:%S") | "sh"}'
2012-08-04 14:22:27

瑾兮 2017-06-19 1 楼

从网上找了些资料,暂时这样实现了,不过这方法个人感觉不是很靠谱,希望大侠给出简便的方法

 echo "114.243.14.141 [04/Aug/2012:14:22:27 +0800] go.dellm.co "GET /product/product.php?product_id=70 HTTP/1.1" 200 3622 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1" 707 3976 214869 -" | awk 'BEGIN{
mons["Jan"]=1;mons["Feb"]=2;mons["Mar"]=3;
mons["Apr"]=4;mons["May"]=5;mons["Jun"]=6;
mons["Jul"]=7;mons["Aug"]=8;mons["Sep"]=9;
mons["Oct"]=10;mons["Nov"]=11;mons["Dec"]=1
}
{
if(index($6,"/product/product.php?")){
gsub(/:/," ",$2);
gsub(///," ",$2);
gsub(/[/,"",$2);
split($2,d);
printf("%04d-%02d-%02d-%02d:%02d:%02dt%sn",d[3],mons[d[2]],d[1],d[4],d[5],d[6],$6)
}
}'