====================================
第19天 周4 20180802 授课老师-李泳谊
作者: 邢永胜
====================================
awk扩展
awk ‘条件{动作}‘
条件 NR==3 或 NR>=3 找出什么样的行
动作 命令 print
ifconfig eth0 | awk ‘NR==2{print $2}‘
ifconfig eth0 | awk -F ‘[: ]+‘ ‘NR==2{print $4}‘
题目1 取出网卡ip
[[email protected] ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:02:4B:F5
inet addr:192.168.56.11 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe02:4bf5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:311780 errors:0 dropped:0 overruns:0 frame:0
TX packets:248323 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:82606035 (78.7 MiB) TX bytes:142937754 (136.3 MiB)
[[email protected] ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:02:4b:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.11/24 brd 192.168.56.255 scope global eth0
inet6 fe80::20c:29ff:fe02:4bf5/64 scope link
valid_lft forever preferred_lft forever
ifconfig eth0 | awk ‘NR==2‘ | sed ‘s#^.*r:##g‘ | sed ‘s#Bc.*##g‘
ifconfig eth0 | awk -F ‘[: ]+‘ ‘NR==2{print $4}‘
ifconfig eth0 | sed -n 2p | sed -r ‘s#(.*addr:)|(Bc.*$)##g‘
# ★★★
ip a s eth0 | awk -F ‘[ /]+‘ ‘NR==3{print $3}‘
ip a s eth0 | sed -n 3p | sed ‘s#^.*t ##g‘ | sed ‘s#/.*$##g‘
ip a s eth0 | sed -n 3p | sed -r ‘s#^.*t |/.*$##g‘
ip a s eth0 | sed -n 3p | sed -r ‘s#(^.*t )|(/.*$)##g‘
ip a s eth0 | awk ‘NR==3‘ | sed -r ‘s#(^.*t )|(/.*$)##g‘
# 反向引用方法取IP
ifconfig eth0 | awk ‘NR==2‘ | sed -r ‘s#(^.*addr:)(.*)(Bca.*$)#\2#g‘
ifconfig eth0 | awk ‘NR==2‘ | sed -r ‘s#^.*addr:(.*)Bca.*$#\1#g‘
ifconfig eth0 | awk ‘NR==2‘ | sed -r ‘s#(^.*addr:)(.*)( Bca.*$)#\2#g‘ | cat -A
# ★★★
ip a s eth0 | awk ‘NR==3‘ | sed -r ‘s#(^.*t )(.*)(/.*$)#\2#g‘
ip a s eth0 | sed -n ‘3p‘ | sed ‘s#inet#oldboy#g‘
ip a s eth0 | sed -n ‘3s#inet#oldboy#gp‘
ip a s eth0 | sed -nr ‘3s#(^.*t )|(/.*$)##gp‘
# hostname加参数直接取得
hostname -I
hostname -i (需配置域名解析)
## 取出IP地址小结
1. awk 指哪打哪
2. sed 使用正则
3. sed 反向引用
题目2 取出stat /etc/hosts权限
[[email protected] /as4k]# stat /etc/hosts | nl
1 File: `/etc/hosts‘
2 Size: 179 Blocks: 8 IO Block: 4096 regular file
3 Device: 803h/2051d Inode: 915740 Links: 2
4 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
5 Access: 2018-08-01 19:41:38.662386294 +0800
6 Modify: 2018-07-25 14:48:45.037907762 +0800
7 Change: 2018-07-25 14:48:45.045908338 +0800
#解答:
stat /etc/hosts | awk ‘NR==4‘ | awk -F "[(/]" ‘{print $2}‘
stat /etc/hosts | awk -F ‘[0/]‘ ‘NR==4{print $2}‘
stat /etc/hosts | sed -nr ‘4s#(^Access: \(0)|(/.*$)##gp‘
stat /etc/hosts | awk -F ‘[(/]‘ ‘NR==4{print $2}‘
stat /etc/hosts | sed -nr ‘4s#(^Access: \(0)(.*)(/-.*$)#\2#gp‘
stat /etc/hosts | sed -nr ‘4s#(^Access: \()(.*)(/-.*$)#\2#gp‘
stat /etc/hosts | awk ‘NR==4‘ | sed -r ‘s#^.*\(([0-9]+).*$#\1#g‘
stat /etc/hosts | sed -nr ‘4s#^.*\(([0-9]+).*$#\1#gp‘
stat /etc/hosts | sed -nr ‘4s#^.*0([0-9]+).*$#\1#gp‘
stat oldboy.txt | awk ‘NR==4‘ | awk -F "[(/]" ‘{print $2}‘
[[email protected] /as4k]# stat -c %A /etc/hosts
-rw-r--r--
[[email protected] /as4k]# stat -c %a /etc/hosts
644
此题心得:
有时想要的东西在命令的结果里,可以考虑查找命令的帮助。
题目3 三剑客过滤空行
已知/oldboy/test.txt文件内容为:
oldboy
xizi
xiaochao
请问如何把文件中的空行过滤掉(要求命令行实现)。
[[email protected] /oldboy]# cat -nA test.txt
1 oldboy$
2 $
3 xizi$
4 $
5 xiaochao$
解答:
grep -v ‘^$‘ test.txt
sed ‘/^$/d‘ test.txt (按行为单位删除)
awk ‘!/^$/‘ test.txt
sed -n ‘/^$/!p‘ test.txt
!在awk sed find 命令中都表示取反。
[[email protected] /oldboy]# grep -v ‘^$‘ test.txt
oldboy
xizi
xiaochao
[[email protected] /oldboy]# awk ‘!/^$/‘ test.txt
oldboy
xizi
xiaochao
[[email protected] /oldboy]# sed ‘/^$/d‘ test.txt
oldboy
xizi
xiaochao
题目4 三剑客取反过滤
已知/oldboy/ett.txt文件内容为:
oldboy
olldboooy
test
请使用grep或egrep正则匹配的方式过滤出前两行内容
[[email protected] /oldboy]# cat ett.txt
oldboy
olldboooy
test
解答:
grep -v test ett.txt
sed ‘/test/d‘ ett.txt
sed -n ‘/test/!p‘ ett.txt
awk ‘!/test/‘ ett.txt
grep -o ‘o.*y‘ ett.txt
egrep ‘oldboy|olldboooy‘ ett.txt
egrep ‘ol+dbo+y‘ ett.txt
三剑客过滤小结
grep 过滤 显示执行过程-o 上色
sed 过滤 替换 修改文件
awk 过滤 取列-F 计算统计
题目5 目录的硬链接
linux下通过mkdir命令创建一个新目录/oldboy/ett,
ett的硬链接数是多少,为什么?
[[email protected] /oldboy]# ls -lidh ett ett/. ett/oldboy/..
664237 drwxr-xr-x 3 root root 4.0K Aug 2 01:39 ett
664237 drwxr-xr-x 3 root root 4.0K Aug 2 01:39 ett/.
664237 drwxr-xr-x 3 root root 4.0K Aug 2 01:39 ett/oldboy/..
[[email protected] /oldboy]# tree
.
├── ett
│?? ├── oldboy
│?? └── oldboy2
├── ett.txt
└── test.txt
3 directories, 2 files
[[email protected] /oldboy]# ls -lidh ett ett/. ett/oldboy/.. ett/oldboy2/..
664237 drwxr-xr-x 4 root root 4.0K Aug 2 01:43 ett
664237 drwxr-xr-x 4 root root 4.0K Aug 2 01:43 ett/.
664237 drwxr-xr-x 4 root root 4.0K Aug 2 01:43 ett/oldboy/..
664237 drwxr-xr-x 4 root root 4.0K Aug 2 01:43 ett/oldboy2/..
可以看出,ett目录的硬链接目录数是4,扣除ett和ett/.这两个目录,还剩下
两个目录是其兄弟目录。因此通过查看目录的硬链接数也可也反推,目录中子目录的
个数。
# 过滤目录中子目录的个数
[[email protected] /oldboy]# ls -l /etc | grep ‘^d‘ | wc -l
77
[[email protected] /oldboy]# ls -lidh /etc/
915713 drwxr-xr-x. 79 root root 4.0K Jul 29 00:37 /etc/
简单显示系统时间和日历
[[email protected] /oldboy]# date
Thu Aug 2 01:58:52 CST 2018
[[email protected] /oldboy]# cal
August 2018
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
按照要求的格式显示日期
示例
1 显示年月日
[[email protected] /oldboy]# date +%F
2018-08-02
2 显示时分秒
[[email protected] /oldboy]# date +%T
15:27:10
3 显示年月日
[[email protected] /oldboy]# date +%Y.%m.%d
2018.08.02
[[email protected] /oldboy]# date +%Y#%m#%d
2018#08#02
[[email protected] /oldboy]# date +%Y%m%d
20180802
4 显示时分秒
[[email protected] /oldboy]# date +%H%M%S
15_29_29
[[email protected] /oldboy]# date +%H:%M:%S
15:29:36
5 显示今天日期
[[email protected] /oldboy]# date
Thu Aug 2 15:29:59 CST 2018
6 格式化显示今天日期
[[email protected] /oldboy]# date +%F\ %T
2018-08-02 15:30:42
7 显示今天是周几
[[email protected] /oldboy]# date +%w
4
8 显示1天前
[[email protected] ~]# date +%F\ %T
2018-08-02 16:04:35
[[email protected] ~]# date -d ‘-1 day‘ +%F\ %T
2018-08-01 16:04:36
9 显示5天后
[[email protected] ~]# date +%F\ %T
2018-08-02 16:06:07
[[email protected] ~]# date -d ‘+5 day‘ +%F\ %T
2018-08-07 16:06:08
10 18年前
[[email protected] ~]# date +%F\ %T
2018-08-02 16:07:10
[[email protected] ~]# date -d ‘-18 year‘ +%F\ %T
2000-08-02 16:07:11
抽象
date [OPTION]... [+FORMAT]
Display the current time in the given FORMAT
-d, --date=STRING
Display time described by string STRING,
as opposed to the default, which is ‘now‘.
可接受类型类似如下:
+1 year 1年后
-1 year 1年前
+3 day 3天后
-3 day 3天前
month, year(s), day(s), week
FORMAT controls the output. Interpreted sequences are:
%F full date; same as %Y-%m-%d
%T time; same as %H:%M:%S
%Y year
%m month (01..12)
%d day of month (e.g, 01)
%H hour (00..23)
%M minute (00..59)
%S second (00..60)
Relative items in date strings
https://www.gnu.org/software/coreutils/manual/html_node/Relative-items-in-date-strings.html#Relative-items-in-date-strings
总结-19天
- 正则表达式,取IP地址,取出权限
- 三剑客进行过滤与区别
- 目录的硬链接数量
- 显示日期,时间
预告-21天
第3关剩余题目
权限
原文地址:http://blog.51cto.com/10308545/2153798