老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目

原始数据:

17/Apr/2015:09:29:24 +0800
17/Apr/2015:09:30:26 +0800
17/Apr/2015:09:31:56 +0800
18/Apr/2015:09:34:12 +0800
18/Apr/2015:09:35:23 +0800
19/Apr/2015:09:23:34 +0800
19/Apr/2015:09:22:21 +0800
20/Apr/2015:09:45:22 +0800

期望结果:

2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

2.参考答案

思路:

2.1 答案:

sed -r ‘s#Apr#04#g;s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g‘ system_date.txt
awk -F "[/: ]" ‘{sub("Apr","04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}‘ system_date.txt 
awk ‘BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}‘ system_date.txt

2.2 演示:

[[email protected] awkfile]# sed -r ‘s#Apr#04#g;s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g‘ system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800
[[email protected] awkfile]# awk -F "[/: ]" ‘{sub("Apr","04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}‘ system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800
[[email protected] awkfile]# awk ‘BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}‘ system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

2.3 详细说明:

2.3.1 方法一:sed替换
[[email protected] awkfile]# sed -r ‘s#Apr#04#g;s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g‘ system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

这一个sed命令分为两个部分:

第一部分-把Apr替换为04
s#Apr#04#g
这一步完成后,文件的内容为17/04/2015:09:29:24 +0800
第二部分-进行匹配
s#^([0-9]+)/([0-9]+)/([0-9]+):(.*) (.*$)#\3-\2-\1 \4 \5#g

图1-1 详细解析正则表达式匹到的内容

2.3.2 方法二:awk替换
[[email protected] awkfile]# awk -F "[/: ]" ‘{sub(/Apr/,"04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}‘ system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

第一个里程碑-指定分隔符
awk -F "[/: ]"表示以/(斜线)或:冒号或空格为分隔符(菜刀)

第一列($1) 第二列($2) 第三列($3) 第四列($4) 第五列($5) 第六列($6) 第七列($7/$NF)
17 Apr 2015 09 29 24 +0800

第二个里程碑-把Apr替换为04
sub(/Apr/,”04”)
这里使用gsub也可以。

第三个里程碑-显示出来并变化位置

[[email protected] awkfile]# awk -F "[/: ]" ‘{sub(/Apr/,"04");print $1,$2,$3,$4,$5,$6,$7}‘ system_date.txt 
17 04 2015 09 29 24 +0800
17 04 2015 09 30 26 +0800
17 04 2015 09 31 56 +0800
18 04 2015 09 34 12 +0800
18 04 2015 09 35 23 +0800
19 04 2015 09 23 34 +0800
19 04 2015 09 22 21 +0800
20 04 2015 09 45 22 +0800

上面的结果已经很接近我们想要的了。
接下来就是变化位置,得到我们想要的结果。

[[email protected] awkfile]# awk -F "[/: ]" ‘{sub(/Apr/,"04");print $3"-"$2"-"$1,$4":"$5":"$6,$7}‘ system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800
2.3.2 方法三:内置变量-技巧
[[email protected] awkfile]# awk ‘BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}‘ system_date.txt 
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

说明:
这个方法唯一要说明的就是FIELDWIDTHS这个内置变量,注意结尾有S哟。
示例1-1 举个例子

[[email protected] ~]# echo "20160121"
20160121

我想把20160121变为2016-01-21

[[email protected] ~]# echo "20160421"
20160421
[[email protected] ~]# echo "20160421"|awk ‘BEGIN{FIELDWIDTHS="4 2 2"}{print $1"-"$2"-"$3}‘
2016-04-21

FIELDWIDTHS这个内置变量可以规定,每一列的长度,每一列有多少个字符或文本。
内置变量的定义一般放在BEGIN模式里面。
FIELDWIDTHS=”4 2 2” 这个定义表示,在一行中,分为3列,第一列4个符号,第二列2个符号,第三列2个符号。
所以第一列的内容是2016,第二列的内容是04,第三列的内容是21.最后组合一下就是我们想要的结果。

[[email protected] awkfile]# awk ‘BEGIN{FIELDWIDTHS="2 1 3 1 4 1 8 1 5"}{print $5"-04-"$1,$7,$NF}‘ system_date.txt
2015-04-17 09:29:24 +0800
2015-04-17 09:30:26 +0800
2015-04-17 09:31:56 +0800
2015-04-18 09:34:12 +0800
2015-04-18 09:35:23 +0800
2015-04-19 09:23:34 +0800
2015-04-19 09:22:21 +0800
2015-04-20 09:45:22 +0800

3.统计信息

今天是每日一题陪伴大家的第52天期待你的进步

对于题目和答案的任何疑问,请在博客评论区留言
往期题目索引

http://lidao.blog.51cto.com/3388056/1914205

【老鸟分享】Linux命令行终端提示符多种实用技巧!
https://mp.weixin.qq.com/s/g-bX6WVjJubv3ShY7jqs0Q

时间: 2024-10-19 12:07:18

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式的相关文章

老男孩教育每日一题-2017年5月9日-vim命令粘贴带#号或注释信息格式会出现混乱情况怎么办

1.题目 老男孩教育每日一题-2017年5月9日-vim编辑器使用知识点:vim命令粘贴带#号或注释信息格式会出现混乱情况,有什么方法进行解决?问题说明:每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式. 2.参考答案 原因分析: 是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进 问题解决: vim在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉:最初的解决

老男孩教育每日一题-2017年5月4日-有一个oldboy.txt文件,把里面所有字母都转换成大写

老男孩教育每日一题-2017年5月4日-有一个oldboy.txt文件,把里面所有字母都转换成大写 文件内容如下: [[email protected] oldboy]# cat oldboy.txt  oldboy.blog.51cto.com www.oldboyedu.com 方法一:sed [[email protected] oldboy]# sed 's#[a-z]#\u&#g' oldboy.txt OLDBOY.BLOG.51CTO.COM WWW.OLDBOYEDU.COM 方

老男孩教育每日一题-2017年5月2日-Linux系统中,不小心把chmod命令的权限弄没了,怎么解决?

老男孩教育每日一题-2017年5月2日-Linux系统中,chmod命令没有执行权限(x权限)或者chmod命令文件的权限为000,怎么解决? 解决方法有两种: 方法一: [[email protected] bin]# cp cp /oldboy/chmod.new (此时复制cp命令文件命名叫chmod.new,此时chmod.new文件有就x的权限,但chmod.new不具备有chmod命令的共功能) [[email protected] bin]# cd /oldboy/ [[email

老男孩教育每日一题-2017年05月23日-一个100M的分区,写入0.5K的,或写入1M的,可以写多少?

1.题目 老男孩教育每日一题-2017年05月23日-一个100M的磁盘分区,写入0.5K的文件,或写入1M的文件,分别可以写多少个?为什么? 2.参考答案 一个100M的磁盘分区,写入0.5K的文件,或写入1M的文件,分别可以写多少个?为什么?错误解答:很容易计算1K的个数:100*1000=100000个,1M文件的个数:100/1=100个 解答思想:先答几点知识 a.上面的考试题考察的是文件系统inode和block知识.b.inode是存放文件属性信息的(也包含指向文件实体的指针),默

老男孩教育每日一题-2017年5月8日-请根据以下数字信息,确认相应的端口号,端口号对应的服务名称

1.题目 老男孩教育每日一题-2017年5月8日-网络服务知识点:请根据以下数字信息,确认相应的端口号,端口号对应的服务名称,以及服务主要的作用(简要说明即可) 202122232567686980110111161 2.参考答案 端口号 端口号对应服务名称 服务作用说明 20/21(TCP) FTP服务端口 20端口为FTP传输数据用 21端口为FTP传输控制信息 文件传输协议(File Transfer Protocol) 由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议

老男孩教育每日一题-2017年4月27日-如何正确清理MySQL binlog?

老男孩教育每日一题-2017年4月27日-如何正确清理MySQL binlog? 今天是每日一题陪伴大家的第37天,期待你的进步. 对于题目和答案的任何疑问,请在博客评论区留言. 往期题目索引 http://lidao.blog.51cto.com/3388056/1914205

老男孩教育每日一题-2017年5月7日-加餐-linux下面如何实现,执行rm命令,就显示do not use rm command

1.题目-老男孩教育每日一题-2017年5月7日-加餐-linux下面如何实现,执行rm命令,就显示do not use rm command 2.要求结果 [[email protected] ~]# rm do not use rm command 3.答案 这需要使用linux里面的别名 alias rm='echo do not use rm command' 注意: 上面命令还要放入到/etc/profile里面永久生效 4.详细过程 第一个里程碑-如何显示这行文字 [[email p

老男孩教育每日一题-2017年5月16日-说说{}与[]这两个符号有什么区别?

1.题目 2.参考答案 这两个看似简单的符号,其实内容还不少.我们一起来看看. 2.1 通配符中 通配符在linux中通常用来匹配/找文件名或目录名.最常用的就是 ls -l *.txt显示出所有以.txt结尾的文件. 2.1.1  {} 花括号,大括号,生产序列 [[email protected] regular]# echo {a..z} {0..9} a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8

老男孩教育每日一题-2017年5月19日-使用find命令的时候 |xargs(管道xargs)与-exe有什么区别?

1.题目 2.参考答案 一般来说这两个参数或命令是一样的.可是在一些情况下尤其是打包压缩的时候差别就很大了.find /oldboy -type f |xargs  find命令找到的文件一次性都给 |xargs 处理find /oldboy -type f -exec   -exec find命令找到一个文件 就传递给 -exec 处理一次 测试方法--通过打包压缩tar命令进行测试 测试环境 [[email protected] ~]# find /oldboy -type f /oldbo