스크립트에서 cut 및 sed 명령 모두 사용

스크립트에서 cut 및 sed 명령 모두 사용

Bash 스크립트에 다음 코드가 있습니다.

#!/bin/bash

# gives summary of my buyings in the report.txt file

echo Here is the summary of your purchases:
echo =========================================
echo

# /dev/stdin is the standard input, i.e. the file
cat /dev/stdin | cut -d ' ' --fields=2,3 | sort && sed -n '2 p' /dev/stdin 

그래서 제가 원하는 것은 공백을 구분 기호로 사용하여 두 번째와 세 번째 필드를 인쇄하고 report.txt 의 두 번째 줄을 인쇄하는 것입니다 sed. 그럼 어떻게 해야 하나요?

고쳐 쓰다:

내 report.txt의 내용은 다음과 같습니다.

Jakaria Books 5
Sakib Khata 3
Afzal Pen 12
Sharif Colorpen 2
Sakib Eraser 1
Sharif Sharpner 1

제안된 대로 스크립트를 편집했는데 이제 다음과 같이 표시됩니다.

#!/bin/bash

# gives summary of my buyings in the report.txt file

echo Here is the summary of your purchases:
echo =========================================

# /dev/stdin is the standard input, i.e. the file
cat /dev/stdin | cut -d ' ' --fields=2,3 | sort | sed -n '2 p'

cat report.txt | ./summary내 스크립트 파일 이름이 어디에 있는지 때문에 스크립트를 실행합니다 . summary이제 출력은 Books 5.

두 번째 및 세 번째 필드를 인쇄하는 것 외에도 report.txt의 두 번째 줄도 인쇄하고 싶습니다. 즉, 출력은 다음과 같아야 합니다.

Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sharpner 1
Sharif Sharpner 1

답변1

sed명령을 연결하면 &&쉘에 명령을 개별적으로 실행하도록 지시합니다. 출력을 그대로 둔 cat ... cut ... sort다음반품클리핑 없이 두 번째 줄을 인쇄합니다.

입력(정렬)의 두 번째 줄만 인쇄하려면 다음과 같이 변경하세요.

cut -d ' ' --fields=2,3 | sort | sed -n 2p

입력 파일을 제공하지 않으면 둘 다 stdin을 읽으므로 /dev/stdin을 반복할 필요가 없습니다 cut.sed


파일에서 두 번째와 세 번째 공백으로 구분된 필드를 인쇄하고 두 번째 줄 전체를 인쇄하려면 이 모든 작업을 sed에서 수행할 수 있습니다.

sed -e 2p -e 's/^[^ ]* //' < report.txt | sort

이는 sed에게 두 가지 프로그램을 실행하라고 지시합니다:

  • p라인 2를 인쇄하고
  • s검색 및 바꾸기: 줄의 시작 부분에서 시작하여 0개 이상의 공백이 아닌 문자, 그 뒤에 공백이 옴... 포함: (없음)

업데이트된 예제 입력을 실행하면 다음과 같은 결과가 나타납니다.

Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sakib Khata 3
Sharpner 1

... Sakib Khata 3파일의 두 번째 줄이기 때문입니다.

답변2

/dev/stdin변수의 내용을 읽습니다.

content=$(cat)
echo "$content" | cut -d ' ' --fields=2,3 | sort
echo "$content" | sed -n '2p'

cat기본값은 에서 읽는 것입니다 stdin.

예:

(
  content=$(cat);
  echo "$content" | cut -d ' ' --fields=2,3 | sort;
  echo "$content" | sed -n '2p'
) < <(echo -e "a b c\nd e f\ng h i\n")


b c
e f
h i
d e f

고쳐 쓰다:

수정된 질문의 예

echo 'Jakaria Books 5
Sakib Khata 3
Afzal Pen 12
Sharif Colorpen 2
Sakib Eraser 1
Sharif Sharpner 1' | (
    content=$(cat);
    echo "$content" | cut -d ' ' --fields=2,3 | sort;
    echo "$content" | sed -n '2p'
)

Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sharpner 1
Sakib Khata 3

관련 정보