shell 명령어를 명령어 출력의 각 행에 적용하려면 어떻게 해야 합니까?
명령어의 출력이 있다고 가정합니다(예:ls -1
):
a
b
c
d
e
...
명령어를 적용하고 싶다(예:echo
)를 각자에게 차례로 전달합니다.예.
echo a
echo b
echo c
echo d
echo e
...
파티 때 가장 쉬운 방법이 뭐죠?
아마 가장 사용하기 쉬울 것이다.xargs
. 고객님의 경우:
ls -1 | xargs -L1 echo
그-L
플래그를 지정하면 입력이 올바르게 읽힙니다.의 man 페이지에서xargs
:
-L number
Call utility for every number non-empty lines read.
A line ending with a space continues to the next non-empty line. [...]
각 회선에서는, 기본적인 프리펜드 조작을 사용할 수 있습니다.
ls -1 | while read line ; do echo $line ; done
또는 출력을 sed에 파이프로 연결하여 보다 복잡한 작업을 수행할 수 있습니다.
ls -1 | sed 's/^\(.*\)$/echo \1/'
for s in `cmd`; do echo $s; done
cmd의 출력이 큰 경우:
cmd | xargs -L1 echo
for 루프를 사용할 수 있습니다.
* ; do의 파일용에코 "$file"다 했어요.
문제의 명령어가 여러 인수를 받아들이는 경우 xargs를 사용하는 것이 거의 항상 효율적이라는 점에 유의하십시오.이는 문제의 유틸리티를 여러 번 생성하는 것이 아니라 한 번만 생성해야 하기 때문입니다.
GNU sed라면 실제로 sed를 사용할 수 있습니다.
... | sed 's/match/command \0/e'
구조:
- 명령어 match로 match 대체
- 대체 시 명령 실행
- 대체 행을 명령 출력으로 바꿉니다.
공백이 있는 파일명에 대응하는 솔루션은 다음과 같습니다.
ls -1 | xargs -I %s echo %s
다음은 동일하지만, 전구체와 실제 수행하려는 작업 간에 명확한 차이가 있습니다.
ls -1 | xargs -I %s -- echo %s
어디에echo
실행하고 싶은 것이 무엇이든, 그리고 그 이후의 것은%s
는 파일명입니다.
Chris Jester-Young의 중복된 질문에 대한 답변 덕분입니다.
xargs는 백슬래시 및 따옴표로 인해 실패합니다.이런 게 필요해요.
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs - 0 옵션:
-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
ls -1
는 항목을 줄바꿈 문자로 끝내기 때문에tr
는 그것들을 늘 문자로 변환합니다.
이 접근방식은 다음 명령어를 사용하여 수동으로 반복할 때보다 약 50배 느립니다.for ...
(Michael Aaron Safyans 답변 참조) (3.55s vs. 0.066s).그러나 파일 찾기, 찾기, 읽기 등의 기타 입력 명령어(tr \\n \\0 <file
) 또는 이와 유사한 방법으로 작업해야 합니다.xargs
이것처럼.
예를 들어, 목록에서 여러 명령을 실행할 때 gawk를 사용하는 것을 좋아합니다.
ls -l | gawk '{system("/path/to/cmd.sh "$1)}'
하지만 도망칠 수 있는 캐릭터들의 탈출은 조금 더 복잡해질 수 있다.
더 나은 결과:
ls -1 | xargs -L1 -d "\n" CMD
언급URL : https://stackoverflow.com/questions/2711001/how-to-apply-shell-command-to-each-line-of-a-command-output
'programing' 카테고리의 다른 글
어떻게 하면 더블을 가장 가까운 인터로 빠르게 반올림 할 수 있을까요? (0) | 2023.04.22 |
---|---|
Swift로 입력된 어레이를 확장하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
git 클론:인증에 실패했습니다. (0) | 2023.04.22 |
bash 세레도크 내의 변수 사용 (0) | 2023.04.22 |
탐색 막대의 테두리를 신속하게 제거하는 방법은 무엇입니까? (0) | 2023.04.22 |