우리는 다음과 같은 파일을 가지고 있습니다:
cat info.txt
linux03.sys98.com net16777728 Speed: 1000Mb/s
linux03.sys98.com net16777728 Speed: 1000Mb/s
linux01.sys98.com net3f0 Speed: 1000Mb/s
linux01.sys98.com net3f0 Speed: 1000Mb/s
linux03.sys98.com net16777728 Duplex: Full
linux03.sys98.com net16777728 Duplex: Full
linux01.sys98.com net3f0 Duplex: Full
linux01.sys98.com net3f0 Duplex: Full
linux04.sys98.com net3f2 Link detected: no
linux04.sys98.com net3f3 Link detected: no
linux04.sys98.com net3f2 Speed: Unknown!
linux04.sys98.com net3f3 Speed: Unknown!
linux04.sys98.com net3f2 Duplex: Unknown! (255)
linux04.sys98.com net3f3 Duplex: Unknown! (255)
linux03.sys98.com net16777728 Link detected: yes
linux03.sys98.com net16777728 Link detected: yes
linux01.sys98.com net3f0 Link detected: yes
linux01.sys98.com net3f0 Link detected: yes
예상대로 세 번째 단어를 두 번째 단어 시작 부분의 20개 공백에 정렬하려고 합니다.
linux03.sys98.com net16777728 Speed: 1000Mb/s
linux03.sys98.com net16777728 Speed: 1000Mb/s
linux01.sys98.com net3f0 Speed: 1000Mb/s
linux01.sys98.com net3f0 Speed: 1000Mb/s
linux03.sys98.com net16777728 Duplex: Full
linux03.sys98.com net16777728 Duplex: Full
linux01.sys98.com net3f0 Duplex: Full
linux01.sys98.com net3f0 Duplex: Full
linux04.sys98.com net3f2 Link detected: no
linux04.sys98.com net3f3 Link detected: no
linux04.sys98.com net3f2 Speed: Unknown!
linux04.sys98.com net3f3 Speed: Unknown!
linux04.sys98.com net3f2 Duplex: Unknown! (255)
linux04.sys98.com net3f3 Duplex: Unknown! (255)
linux03.sys98.com net16777728 Link detected: yes
linux03.sys98.com net16777728 Link detected: yes
linux01.sys98.com net3f0 Link detected: yes
linux01.sys98.com net3f0 Link detected: yes
printf나 다른 솔루션을 사용하여 이 작업을 어떻게 수행할 수 있습니까?
답변1
그리고 perl
:
perl -ne 'printf "%s %-20s %s\n", /(\S+\s+)(\S+)\s*(.*)/' your-file
또는 패턴과 일치하지 않는 줄을 만지지 마십시오.
perl -pe '$_ = sprintf "%s %-20s %s\n", $1, $2, $3
if /(\S+\s+)(\S+)\s*(.*)/' your-file
답변2
를 사용하면 sed
두 번째 필드 뒤에 공백을 많이 추가하고 20번째 문자 뒤의 모든 내용을 제거할 수 있습니다.
sed -E 's/([^ ]* ){2}/& /;s/( .{20}) */\1/'
답변3
bash를 사용하면 다음과 같이 작성할 수 있습니다.
while read a b rest; do
printf "%s %-20s %s\n" "$a" "$b" "$rest"
done < info.txt