我想转换这个文本:
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//'
有没有办法实现这个,或者我应该只写 If...Then...
谢谢大家的回答 :D(你总是给我看新东西 :D)
最佳答案
answer通过 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
和 GNU sed
进行了测试,没有任何变化。 GNU sed
具有诸如 -r
之类的选项来更改正则表达式的解释,这将为您节省一些反斜杠。
关于linux - bash 合并文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14483341/