원문 캡처 · rentes.github.io
원문 캡처 · rentes.github.io

moreutils는 유닉스·리눅스·맥OS에서 셸 작업을 돕는 명령줄 도구 모음이다. 명령 출력 숨기기, 파일 목록 비교, 파이프라인 중간 편집처럼 기본 도구만으로 번거로운 작업을 처리할 수 있다. Debian 패키지 페이지에서 패키지 정보를 확인할 수 있다.

맥OS에서는 brew install moreutils, 아치 리눅스에서는 sudo pacman -S moreutils, 데비안·우분투·민트에서는 sudo apt-get install moreutils, RHEL·페도라·CentOS에서는 sudo yum install moreutils로 설치한다. 배포판에 따라 설치 방법이 다를 수 있다. 맥OS에서 GNU parallel을 설치하려면 moreutils에 포함된 parallel과 충돌할 수 있으므로 brew install moreutils --without-parallel을 실행한 뒤 brew install parallel을 사용한다. 충돌 관련 안내도 참고할 수 있다.

도구별 활용 예시는 다음과 같다.

  • chronic은 명령이 실패할 때만 표준 출력과 표준 오류를 보여준다. 성공한 작업의 출력을 숨기면서 실패 여부는 확인할 수 있어 크론 작업에 쓸 수 있다.
  • combine은 두 파일의 줄을 and, not, or, xor 연산으로 결합한다. 결과는 기본적으로 첫 번째 파일에 나온 순서를 따르므로 연산 순서가 바뀌면 결과 순서도 달라질 수 있다. 순서에 상관없는 결과가 필요하면 sort와 uniq를 함께 쓴다.
  • errno는 오류 매크로 이름이나 번호를 입력해 해당 설명을 찾는다. ifdata는 네트워크 인터페이스 정보를 셸 스크립트에서 다루기 쉬운 형식으로 출력하며, isutf8은 파일이나 표준 입력이 유효한 UTF-8인지 확인한다.
  • ifne는 표준 입력이 비어 있지 않을 때 명령을 실행한다. -n을 지정하면 입력이 비어 있을 때 실행하며, 이 경우 입력이 비어 있지 않으면 입력 내용을 그대로 전달한다.
  • mispipe는 두 명령을 파이프로 연결하되 첫 번째 명령의 종료 상태를 반환한다. bash와 zsh의 pipefail은 파이프라인 안에서 실패한 명령의 상태를 반환한다는 점에서 동작이 다르다.
  • parallel은 인수마다 명령을 실행하고 작업을 병렬로 처리할 수 있다. 기본적으로 CPU 하나당 작업 하나를 실행한다. xargs의 -n, -P 옵션도 여러 프로세스를 실행하는 대안으로 소개한다.
  • pee는 표준 입력을 여러 명령에 복사해 전달한다. sponge는 표준 입력을 모두 읽은 뒤 파일에 기록하므로, 임시 파일 없이 같은 파일을 읽고 다시 쓰는 파이프라인을 구성할 수 있다.
  • ts는 입력 각 줄 앞에 타임스탬프를 붙인다. 기본 형식은 %b %d %H:%M:%S이며, 형식은 strftime 규칙을 따른다. %.S와 %.s는 초와 초 단위 시각을 소수 초 정밀도로 출력한다.
  • vidir는 텍스트 편집기에서 디렉터리 항목을 줄 단위로 편집해 파일을 삭제하거나 이름을 바꾸게 한다. vipe는 파이프라인 중간에 편집기를 열어 전달 중인 데이터를 수정한다. 두 도구 모두 편집기 선택에 $EDITOR 환경 변수를 사용한다.
  • zrun은 명령 인수로 받은 압축 파일을 임시 파일로 풀어 해당 명령에 전달한다. gz, bz2, Z, xz, lzma, lzo 형식을 지원한다.

자료는 lckdo가 잠금을 잡고 프로그램을 실행하는 도구라고 소개하면서, util-linux의 유사 명령 flock이 있어 lckdo가 더 이상 권장되지 않으며 향후 moreutils 버전에서 제거될 수 있다고 설명한다. 다만 이어지는 사용 예시는 lckdo가 아니라 flock을 사용한다. 자세한 내용은 각 명령의 매뉴얼 페이지에서 확인할 수 있다.

부록: 원문 예시

text
$ ping <IP address or hostname> | ts Jul 27 15:53:15 PING EE.FF.GG.HH (EE.FF.GG.HH) 56(84) bytes of data. Jul 27 15:53:15 From AA.BB.CC.DD icmp_seq=3 Destination Net Unreachable Jul 27 15:53:18 From AA.BB.CC.DD icmp_seq=7 Destination Net Unreachable (...) Jul 27 15:54:08 64 bytes from EE.FF.GG.HH: icmp_seq=57 ttl=127 time=0.673 ms