소개
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 명령어 사용
dos2unix와 unix2dos 유틸리티는 텍스트 파일을 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.
방법 비교
지금까지 배운 방법들을 요약해 보겠습니다.
col -b: 캐리지 리턴 및 기타 특수 문자를 필터링하는 데 적합dos2unix: Windows/DOS 텍스트 파일을 Unix 형식으로 변환하기 위해 특별히 설계됨tr -d '\r': 문자 변환을 사용하는 간단한 접근 방식
각 방법은 장점이 있습니다.
col은 다재다능하며 다양한 특수 문자를 처리할 수 있습니다.dos2unix는 줄 바꿈 변환을 위해 만들어진 전용 도구입니다.tr은 거의 모든 Unix 시스템에서 사용할 수 있는 간단한 솔루션입니다.
대부분의 줄 바꿈 변환 작업에는 dos2unix가 가장 직관적인 도구입니다. 하지만 이러한 모든 방법을 알고 있으면 다양한 시스템에서 작업할 때 유연하게 대처할 수 있습니다.
요약
이번 실습에서는 Linux에서의 줄 바꿈 필터링과 다양한 줄 바꿈 형식을 처리하는 방법을 배웠습니다.
운영 체제별 줄 바꿈 규칙을 배웠습니다.
- Linux/Unix: Line Feed (LF,
\n) - Windows: Carriage Return + Line Feed (CRLF,
\r\n) - Classic Mac OS: Carriage Return (CR,
\r)
- Linux/Unix: Line Feed (LF,
cat -v와 같은 도구를 사용하여 서로 다른 줄 바꿈을 가진 파일을 생성하고 확인하는 연습을 했습니다.col명령어의-b옵션을 사용하여 캐리지 리턴과 기타 특수 문자를 필터링하는 방법을 배웠습니다.이 지식을 로그 파일이나 셸 스크립트와 같은 실무 예제에 적용했습니다.
줄 바꿈을 처리하기 위한 대체 방법들을 살펴보았습니다.
- Windows/DOS 텍스트 파일을 Unix 형식으로 변환하는
dos2unix유틸리티 - 특정 문자를 변환하거나 삭제하는
tr명령어
- Windows/DOS 텍스트 파일을 Unix 형식으로 변환하는
이러한 기술은 서로 다른 운영 체제에서 생성된 파일을 다루는 시스템 관리자와 개발자에게 필수적입니다. 줄 바꿈을 올바르게 처리하면 호환성을 확보하고 텍스트 처리 작업에서 발생할 수 있는 예상치 못한 동작을 방지할 수 있습니다.



