2

我想转换这个文本:

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)

4

6 回答 6

3

我不太了解 sed,但在 AWK 中:

awk 'NR==1{prefix=$0;next} {print prefix, $0}' file

更新

如果是这种情况,请查找只有一个字段(列)的行,将其用作前缀。这意味着,对上述脚本的唯一更改是 NF(字段数)代替 NR(记录数或行数)。

awk 'NF==1{prefix=$0;next} {print prefix, $0}' file
于 2013-01-23T15:41:56.023 回答
3

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正则表达式;sed它在带有 BSD和 GNU的 Mac OS X (10.7.5) 上进行了测试,sed没有改变。GNUsed有一些选项,例如-r更改正则表达式的解释,这将为您节省一些反斜杠。

于 2013-01-23T16:10:48.337 回答
2

这可能对您有用(GNU sed):

sed -r '1{h;d};G;s/(.*)\n(.*)/\2 \1/' file
  • 1{h;d}将第一行保存在保持空间 (HS) 中,然后删除模式空间 (PS)。
  • G在所有后续行中,将换行符和 HS 添加到 PS。
  • s/(.*)\n(.*)/\2 \1/重新排列 PS 并删除引入的换行符。

自发布答案以来,原始问题已更改,考虑到这一点:

sed -r '/%/!{h;d};G;s/(.*)\n(.*)/\2 \1/' file

这通过在 HS 中保存不包含%.

于 2013-01-23T15:49:46.863 回答
0

试试这个:

awk '!/^\/dev/{header=$0;next} {print header, $0}' input.txt

或者(功能相同,但更容易阅读和理解,IMO):

awk '{if($0 !~ /^\/dev/){header=$0}else{print header, $0}}' input.txt
于 2013-01-23T16:05:36.093 回答
0
awk '{if($0~/mysite.com/){x=$0}else{print x,$0}}' your_file

在这里测试

于 2013-01-23T16:08:45.040 回答
0

使用 awk 的另一种方法如下:

awk '{if ($1 ~ /mysite.com/){a= $0 } if ($1 ~ /dev/){ print a" "$0}}' temp.txt

  1. a = $0将该行复制到包含mysite.com
  2. 如果第二行包含/dev,则它连接两行

或 potong sed 的其他变体

sed -re '/mysite.com/{h;d};G;s/(.*)\n(.*)/\2 \1/' temp.txt

于 2013-01-24T06:32:30.537 回答