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