我觉得这节应该着重讲讲脚本里那些数字,一开始看这节也是比较迷糊,后面自己练了几个例子化繁为简才明白这节的内容。
sed -n '1h;G;x;$p',每次读1行进模式空间,第1行会命中1h、G、x这3个命令,第2~5行只命中G、x这2个命令,第6行即最后一行命中G、x、$p这3个命令,每次执行完一行的全部命令后,原本要打印,但是被-n抑制输出,故只有第6行的$p才会输出,然后就得到第1个反转的效果。
前面的课程应该也有提到1h、$p这种寻址,但是当时没太在意,要是这里顺带提一下,应该会清晰很多。
2020-02-03
17
许童童
这两节的操作感觉有点难啊。
2019-09-01
1
6
西风吹北川
# 要实现倒序排列
[root@localhost test]# head -6 /etc/passwd | cat -n | tac
6 sync:x:5:0:sync:/sbin:/bin/sync
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
[root@localhost test]# cat -n /etc/passwd | head -6 | sed -n '1h;G;x;$p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
1 root:x:0:0:root:/root:/bin/bash
# 模式空间 保留空间
1 \n
h 1 1
G 1\n1 1
x 1 1\n1
2 1
G 2\n1 1
x 1 2\n1
。。。。到最后一行
6 5\n4\n3\n2\n1
G 6\n5\n4\n3\n2\n1 5\n4\n3\n2\n1
x 5\n4\n3\n2\n1 6\n5\n4\n3\n2\n1
所以输出如上面会重叠
#设置第一行不追加 最后一行不交换
[root@localhost test]# cat -n /etc/passwd | head -6 | sed -n '1h;1!G;$!x;$p'
6 sync:x:5:0:sync:/sbin:/bin/sync
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
#另一种思路:读取一行,从保留空间拿出来追加,覆盖放进保留空间,等到最后一次再输出
[root@localhost test]# cat -n /etc/passwd | head -6 | sed -n 'G;h;$p'
6 sync:x:5:0:sync:/sbin:/bin/sync
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
[root@localhost test]#
#多一个空行,设置第一行不要从保留空间拿
[root@localhost test]# cat -n /etc/passwd | head -6 | sed -n '1!G;h;$p'
6 sync:x:5:0:sync:/sbin:/bin/sync
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
1 root:x:0:0:root:/root:/bin/bash
[root@localhost test]#
2020-08-13
3
H.zx
听得我一脸懵
2022-03-04
2
Abcd
# 使用 sed 命令反转文件的前 6 行
cat -n /etc/passwd | head -6 | sed -n '1!G;$!h;$p'
# 解析:
# 1. [除了第一行],先将保持空间的内容追加到模式空间
# 2. [除了最后一行],用模式空间的内容覆盖掉保持空间的内容
# 3. [仅针对最后一行],打印当前模式空间的内容