Linux 줄 바꿈(Line Feed) 필터링

LinuxBeginner
지금 연습하기

소개

Linux 시스템에서 텍스트 파일을 다루다 보면 줄 바꿈 형식이 일치하지 않아 문제가 발생하는 경우가 있습니다. 이러한 불일치는 주로 Windows와 Linux처럼 서로 다른 운영 체제 간에 파일을 전송할 때 발생합니다.

이번 실습에서는 Linux의 줄 바꿈 문자에 대해 알아보고, 명령줄 도구를 사용하여 이를 적절하게 처리하는 방법을 배웁니다. 운영 체제별 줄 바꿈 방식의 차이를 이해하고, col 명령어를 사용하여 텍스트 파일의 줄 바꿈을 필터링하는 방법을 마스터하게 됩니다.

이러한 기본 기술은 다양한 환경에서 작업하는 시스템 관리자와 개발자에게 필수적이며, 파일의 출처와 관계없이 텍스트 파일이 올바르게 처리되도록 보장하는 데 도움을 줍니다.

운영 체제별 줄 바꿈 이해하기

운영 체제마다 텍스트 파일의 줄 끝을 나타내는 문자가 다릅니다.

  • Linux/Unix: Line Feed (LF, \n) 사용
  • Windows: Carriage Return + Line Feed (CRLF, \r\n) 사용
  • Classic Mac OS: Carriage Return (CR, \r) 사용

서로 다른 시스템에서 생성된 파일을 다룰 때, 이러한 차이로 인해 서식 문제가 발생하거나 텍스트 처리 도구에서 예상치 못한 동작이 나타날 수 있습니다.

먼저 실습을 위한 디렉토리를 생성하겠습니다.

mkdir -p ~/project/line_feeds
cd ~/project/line_feeds

먼저 Unix 스타일 줄 바꿈(LF)을 가진 간단한 텍스트 파일을 생성합니다.

echo -e "This is line 1.\nThis is line 2.\nThis is line 3." > unix_file.txt

이제 Windows 스타일 줄 바꿈(CRLF)을 가진 파일을 생성합니다.

echo -e "This is line 1.\r\nThis is line 2.\r\nThis is line 3." > windows_file.txt

이 파일들의 차이를 확인하기 위해 출력할 수 없는 문자를 표시해 주는 cat 명령어의 -v 옵션을 사용합니다.

cat -v unix_file.txt

다음과 같은 출력이 나타납니다.

This is line 1.
This is line 2.
This is line 3.

이제 Windows 스타일 파일을 확인합니다.

cat -v windows_file.txt

다음과 같은 출력이 나타납니다.

This is line 1.^M
This is line 2.^M
This is line 3.

여기서 ^M 문자는 Windows 줄 바꿈의 일부인 캐리지 리턴(\r)을 나타냅니다. 이러한 문자는 Linux에서 파일을 처리할 때 문제를 일으킬 수 있습니다.

줄 바꿈 필터링을 위한 col 명령어 소개

Linux는 줄 바꿈 문제를 처리하기 위한 여러 도구를 제공합니다. 그중 하나인 col 명령어는 주로 역방향 줄 바꿈을 필터링하기 위해 설계되었지만, 다른 특수 문자를 처리하는 데도 사용할 수 있습니다.

먼저 col 명령어의 기본 사용법을 이해해 봅시다.

man col | head -20

우리의 목적에 가장 유용한 col 옵션은 -b입니다. 이 옵션은 모든 백스페이스 문자와 그 앞에 있는 문자를 제거하도록 col에 지시합니다. 이는 Windows 스타일 줄 바꿈에 포함된 캐리지 리턴(\r) 문자를 제거하는 데도 유용합니다.

실습을 위해 줄 바꿈이 혼합된 파일을 생성해 보겠습니다. LabEx 브라우저 터미널에서는 제어 문자를 직접 입력하는 것보다 printf를 사용하는 것이 더 안정적입니다.

cd ~/project/line_feeds
printf 'This line has Unix endings.\nThis line has Windows endings.\r\nAnother Unix line.\nAnother Windows line.\r\n' > mixed_file.txt

이제 이 파일을 확인해 봅니다.

cat -v mixed_file.txt

결과는 다음과 같습니다.

This line has Unix endings.
This line has Windows endings.^M
Another Unix line.
Another Windows line.^M

이제 col 명령어를 사용하여 줄 바꿈을 정리할 수 있습니다.

col -b < mixed_file.txt > cleaned_file.txt

결과를 확인합니다.

cat -v cleaned_file.txt

이제 다음과 같이 보일 것입니다.

This line has Unix endings.
This line has Windows endings.
Another Unix line.
Another Windows line.

^M 문자(캐리지 리턴)가 제거되고 Linux 텍스트 파일의 올바른 형식인 줄 바꿈(LF)만 남은 것을 확인할 수 있습니다.

실무 예제 다루기

이제 배운 내용을 좀 더 현실적인 예제에 적용해 보겠습니다. 시스템 로그, 설정 파일, 스크립트는 일관된 줄 바꿈을 유지하기 위해 처리가 필요한 경우가 많습니다.

줄 바꿈이 혼합된 샘플 로그 파일을 생성합니다.

cd ~/project/line_feeds
printf '[2023-05-15 08:00:01] Server started\r\n[2023-05-15 08:05:23] User login: admin\n[2023-05-15 08:10:45] Configuration updated\r\n[2023-05-15 08:15:30] Backup process started\n[2023-05-15 08:30:12] Backup completed\r\n[2023-05-15 09:00:00] Scheduled maintenance started\n' > server_log.txt

파일을 확인합니다.

cat -v server_log.txt

일부 줄 끝에 캐리지 리턴 문자(^M)가 있는 것을 볼 수 있습니다.

[2023-05-15 08:00:01] Server started^M
[2023-05-15 08:05:23] User login: admin
[2023-05-15 08:10:45] Configuration updated^M
[2023-05-15 08:15:30] Backup process started
[2023-05-15 08:30:12] Backup completed^M
[2023-05-15 09:00:00] Scheduled maintenance started

이제 이 로그 파일을 정리합니다.

col -b < server_log.txt > clean_server_log.txt

결과를 확인합니다.

cat -v clean_server_log.txt

출력에서 캐리지 리턴 문자가 제거되었음을 확인할 수 있습니다.

[2023-05-15 08:00:01] Server started
[2023-05-15 08:05:23] User login: admin
[2023-05-15 08:10:45] Configuration updated
[2023-05-15 08:15:30] Backup process started
[2023-05-15 08:30:12] Backup completed
[2023-05-15 09:00:00] Scheduled maintenance started

또 다른 흔한 예제로, 줄 바꿈이 일관되지 않은 스크립트 파일을 만들어 보겠습니다. 이 명령어는 터미널 단축키에 의존하지 않고 파일 내용에 캐리지 리턴을 그대로 유지합니다.

cd ~/project/line_feeds
printf '#!/bin/bash\r\n## This is a sample script\r\necho "Starting script..."\r\nfor i in {1..5}\ndo\r\n    echo "Processing item $i"\r\ndone\necho "Script completed."\n' > script.sh

파일을 확인합니다.

cat -v script.sh

결과는 다음과 같습니다.

#!/bin/bash^M
## This is a sample script^M
echo "Starting script..."^M
for i in {1..5}
do^M
    echo "Processing item $i"^M
done
echo "Script completed."

이제 이 스크립트 파일을 정리합니다.

col -b < script.sh > clean_script.sh
chmod +x clean_script.sh

결과를 확인합니다.

cat -v clean_script.sh

이제 출력에서 일관된 줄 바꿈을 확인할 수 있습니다.

#!/bin/bash
## This is a sample script
echo "Starting script..."
for i in {1..5}
do
    echo "Processing item $i"
done
echo "Script completed."

줄 바꿈이 일관되지 않으면 셸 스크립트 실행 오류를 유발할 수 있으므로, 일관된 줄 바꿈을 유지하는 것은 매우 중요합니다.

줄 바꿈 처리를 위한 대체 방법

col 명령어는 줄 바꿈 필터링에 유용하지만, Linux는 서로 다른 형식 간의 줄 바꿈 변환을 위해 특별히 설계된 다른 도구들도 제공합니다. 몇 가지 대안을 살펴보겠습니다.

dos2unix 및 unix2dos 명령어 사용

dos2unixunix2dos 유틸리티는 텍스트 파일을 DOS/Windows 형식과 Unix 형식 간에 변환하기 위해 특별히 설계되었습니다.

먼저 이 유틸리티들을 설치합니다.

sudo apt update
sudo apt install -y dos2unix

이제 테스트를 위해 Windows 스타일 파일을 하나 더 생성합니다.

cd ~/project/line_feeds
printf '[General]\r\nUsername=admin\r\nPassword=12345\r\nDebug=true\r\n\n[Network]\r\nHost=127.0.0.1\r\nPort=8080\r\nTimeout=30\r\n' > config.ini

파일을 확인합니다.

cat -v config.ini

캐리지 리턴 문자(^M)가 보일 것입니다.

[General]^M
Username=admin^M
Password=12345^M
Debug=true^M

[Network]^M
Host=127.0.0.1^M
Port=8080^M
Timeout=30^M

이제 dos2unix를 사용하여 이 파일을 변환합니다.

dos2unix config.ini

이 명령어는 파일을 제자리에서 수정합니다. 결과를 확인합니다.

cat -v config.ini

캐리지 리턴 문자가 사라졌을 것입니다.

[General]
Username=admin
Password=12345
Debug=true

[Network]
Host=127.0.0.1
Port=8080
Timeout=30

tr 명령어 사용

또 다른 방법은 문자를 변환하거나 삭제할 수 있는 tr 명령어를 사용하는 것입니다.

cd ~/project/line_feeds
printf 'This is a Windows-style file\r\nwith carriage returns\r\nat the end of each line.\r\n' > tr_example.txt

파일을 확인합니다.

cat -v tr_example.txt

결과는 다음과 같습니다.

This is a Windows-style file^M
with carriage returns^M
at the end of each line.^M

이제 tr을 사용하여 캐리지 리턴 문자를 삭제합니다.

tr -d '\r' < tr_example.txt > tr_cleaned.txt

결과를 확인합니다.

cat -v tr_cleaned.txt

출력은 다음과 같아야 합니다.

This is a Windows-style file
with carriage returns
at the end of each line.

방법 비교

지금까지 배운 방법들을 요약해 보겠습니다.

  1. col -b: 캐리지 리턴 및 기타 특수 문자를 필터링하는 데 적합
  2. dos2unix: Windows/DOS 텍스트 파일을 Unix 형식으로 변환하기 위해 특별히 설계됨
  3. tr -d '\r': 문자 변환을 사용하는 간단한 접근 방식

각 방법은 장점이 있습니다.

  • col은 다재다능하며 다양한 특수 문자를 처리할 수 있습니다.
  • dos2unix는 줄 바꿈 변환을 위해 만들어진 전용 도구입니다.
  • tr은 거의 모든 Unix 시스템에서 사용할 수 있는 간단한 솔루션입니다.

대부분의 줄 바꿈 변환 작업에는 dos2unix가 가장 직관적인 도구입니다. 하지만 이러한 모든 방법을 알고 있으면 다양한 시스템에서 작업할 때 유연하게 대처할 수 있습니다.

요약

이번 실습에서는 Linux에서의 줄 바꿈 필터링과 다양한 줄 바꿈 형식을 처리하는 방법을 배웠습니다.

  1. 운영 체제별 줄 바꿈 규칙을 배웠습니다.

    • Linux/Unix: Line Feed (LF, \n)
    • Windows: Carriage Return + Line Feed (CRLF, \r\n)
    • Classic Mac OS: Carriage Return (CR, \r)
  2. cat -v와 같은 도구를 사용하여 서로 다른 줄 바꿈을 가진 파일을 생성하고 확인하는 연습을 했습니다.

  3. col 명령어의 -b 옵션을 사용하여 캐리지 리턴과 기타 특수 문자를 필터링하는 방법을 배웠습니다.

  4. 이 지식을 로그 파일이나 셸 스크립트와 같은 실무 예제에 적용했습니다.

  5. 줄 바꿈을 처리하기 위한 대체 방법들을 살펴보았습니다.

    • Windows/DOS 텍스트 파일을 Unix 형식으로 변환하는 dos2unix 유틸리티
    • 특정 문자를 변환하거나 삭제하는 tr 명령어

이러한 기술은 서로 다른 운영 체제에서 생성된 파일을 다루는 시스템 관리자와 개발자에게 필수적입니다. 줄 바꿈을 올바르게 처리하면 호환성을 확보하고 텍스트 처리 작업에서 발생할 수 있는 예상치 못한 동작을 방지할 수 있습니다.