我想转换这个文本:
qa-ops01.mysite.com
/dev/mapper/sys-home 58G 26G 30G 47% /home
/dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /tmp
qa-ops02.mysite.com
/dev/mapper/sys-home 58G 26G 30G 47% /usr
/dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /var
qa-ops03.mysite.com
/dev/mapper/sys-home 58G 26G 30G 47% /lib
/dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /etc
对于这个:
qa-ops01.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /home
qa-ops01.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /tmp
qa-ops02.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /usr
qa-ops02.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /var
qa-ops03.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /lib
qa-ops03.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /etc
我用过
cat FILE |sed 'N;s/.com\n//'
有没有办法实现这一点,或者我应该只写“如果...那么...”
感谢大家的回答:D(你们总是向我展示新事物:D)
The answer https://stackoverflow.com/a/14483620/15168 by potong https://stackoverflow.com/users/967492/potong几乎是正确的;它只处理一台服务器,而不是多台服务器,但所需的更改很小。
$ sed -e '/^[^ ]*$/{h;d;}' -e 'G; s/\(.*\)\n\(.*\)/\2 \1/' data
qa-ops01.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /home
qa-ops01.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /tmp
qa-ops02.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /usr
qa-ops02.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /var
qa-ops03.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /lib
qa-ops03.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /etc
$
该脚本分为两部分,由两个部分标识-e
选项。第一部分标识服务器名称;这些行不包含空格(因此/^[^ ]*$/
查找没有空格的行),并将该行复制到保留空间(h
)然后删除它(d
)并继续下一行。脚本的第二部分仅在包含空格的行上执行。它将保留空间的内容附加到换行符之后的模式空间(G
);然后它将该行分成“换行符之前的所有内容”和“换行符之后的所有内容”,并切换它们以便“之后”(\2
) 首先出现,然后是一个空格,然后是“之前”(\1
).
这个用的是经典的sed
常用表达;它在 Mac OS X (10.7.5) 和 BSD 上进行了测试sed
以及 GNUsed
没有改变。 GNUsed
有这样的选项-r
更改正则表达式的解释,这将为您节省一些反斜杠。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)