명령줄에서 여러 명령을 순차적으로 실행하는 방법은 무엇입니까?

명령줄에서 여러 명령을 순차적으로 실행하는 방법은 무엇입니까?

여러 명령을 명령줄에 붙여넣고 각 줄을 순서대로 실행하여 결과를 출력하고 싶습니다.

입력 내용을 붙여넣습니다.

cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l   

출력을 얻습니다.

  469005
    9999
    5099
      25

하지만 그 대신 각 명령이 각 개행 문자 다음에 실행되도록 하고 내산출다음과 같이 보입니다:

cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l
469005
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l
9999
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
5099                                                                       

이것이 가능한지는 확실하지 않지만 각 결과를 원래 행에 다시 매핑할 필요가 없다면 시간이 많이 절약될 것입니다.

답변1

명령을 복사하여 터미널 에뮬레이터에 붙여넣으면 쉽지 않습니다. 여기서 문제는 터미널(텍스트 입력 및 표시를 처리하는)이 셸(프롬프트를 인쇄하고 명령줄을 처리하는)과 다른 프로세스이며, 터미널은 사용자가 입력하는 텍스트가 무엇인지 실제로 알 수 없다는 것입니다. 수단. 반죽. 따라서 이전 명령이 완료될 때까지 기다리거나 셸이 다시 프롬프트를 표시할 때까지 기다릴 수 없습니다.

당신이 할 수 있는 일은 쉘이 실행될 때 명령을 인쇄하도록 하거나 이 특별한 경우에 s를 실행하는 짧은 쉘 루프를 작성하는 것 set -v입니다 .set -xgrep

for pattern in 'type_of_record_new creating' \
    'type_of_record_modification found 1' \
    'type_of_record_modification found 0' \
    'type_of_record_inactivation found 1'
do
    printf "%s:\n%10d" "$pattern"
    grep -c -e "$pattern" type_of_record.txt
done

이것은 다음과 같은 출력을 제공합니다

type_of_record_new creating: 469005
type_of_record_modification found 1: 9999

물론 정확한 형식은 수정할 수 있습니다. 숫자를 별도의 줄에 오른쪽 정렬로 표시하려면 명령 대체와 printf %d줄 번호를 사용할 수 있습니다.

for pattern in ...
do
    printf "%s:\n%8d\n" "$pattern" "$(grep -c -e "$pattern" type_of_record.txt)" 
done

답변2

구분된 문서에 클립보드를 붙여넣기만 하면 됩니다.

$ sh -v << EOF
> cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
> cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
> cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
> cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
> EOF
cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
cat: type_of_record.txt: No such file or directory
       0

위에서는 "sh -v << EOF"를 입력한 다음 질문의 코드를 터미널에 붙여넣은 다음 Enter 키를 누르고 "EOF"를 입력했습니다. 이런 일을 한다면 꼭주의 깊은붙여넣고 있는 텍스트를 확인하세요. 붙여넣은 텍스트가 삽입되지 않도록 구분 기호(예: )를 인용해야 할 수도 있지만 sh << 'EOF'이 경우에는 필요하지 않습니다.

그러나 이 특별한 경우에는 파일을 한 번만 반복하면 되도록 awk를 사용하여 일치하는 레코드 수를 계산하는 것이 더 좋습니다.

답변3

이는 다음을 사용하여 echo수행될 수 있습니다.

먼저 작은따옴표를 사용하여 명령을 문자열로 축어적으로 에코한 다음

둘째, 명령을 실행하는 큰따옴표를 사용하여 명령을 에코합니다.

echo '$(date)'; echo "$(date)"

이것은 만든다

robert@pip2:/tmp$ echo '$(date)'; echo "$(date)"
$(date)
Fri May 18 07:30:27 PDT 2018

관련 정보