grep 검색 결과를 연결하려고 합니다. 내 grep 검색은 내 시스템에서 약 4개의 파일을 찾아 각 파일에 대해 새 줄에 출력했습니다. 나는 이 정보를 전달함으로써 tr '\n' ' '
검색에 포함된 모든 파일을 한 줄로 가져온 다음 이를 cat > bigfile
큰 파일에 전달하여 검색에 포함된 모든 파일의 내용을 포함할 수 있다고 생각했습니다. 대신 bigfile
grep에서 찾은 파일 목록만 포함됩니다.
bigfile
grep으로 찾은 모든 파일의 연결을 포함하는 방법 .
이것은 내가 시도한 코드입니다.
egrep -Rl 'users.*log|log.*users' /home/moose/test | tr '\n' ' ' | cat > bigfile
그런 다음 다음 bigfile
을 포함합니다.
/home/moose/test/file1 /home/moose/test/2 /home/moose/test/3 /home/moose/moose/file4
감사해요
답변1
연결을 시도하면콘텐츠파일을 단일 와 일치시키면 파일 이름을 다른 인수 bigfile
로 전달해야 합니다 . 다음을 사용할 수 있습니다.cat
xargs
egrep -ZRl 'users.*log|log.*users' /home/moose/test | xargs -0 cat
-Z
및 플래그를 추가하면 -0
널 구분 기호가 포함된 이름이 전달되므로 명령이 모든 유효한 파일 이름(공백이나 개행 문자가 포함된 이름 포함)을 처리할 수 있습니다.
답변2
cat
여기서 할게 없어. 단순히 출력을 리디렉션하는 것은tr
출력을 파이프로 연결하여 리디렉션하는 것과 사실상 동일합니다cat
.paste
대신 시도해 보세요tr
.egrep -Rl 'users.*log|log.*users' /home/moose/test | paste -sd' ' > bigfile
xargs
또한 작동하며 명령줄의 최대 길이에 도달하면 출력을 여러 줄로 분할할 수 있다는 장점이 있습니다.egrep -Rl 'users.*log|log.*users' /home/moose/test | xargs > bigfile
그런데, 파일이 한 줄에 하나씩 나열되는지 아니면 모두 한 줄에 나열되는지가 왜 중요한가요? 이것을 다른 프로그램의 명령줄에서 사용하거나 또는 for
루프 에 대한 입력 으로 사용할 계획이라면 while
어쨌든 한 줄에 하나의 파일 이름을 사용하는 것이 더 나을 수 있습니다. 특히 파일 이름에 공백 문자가 있는 파일이 있는 경우에는 더욱 그렇습니다.
답변3
마지막 파이프 /cat이 필요하지 않습니다. tr 다음의 파일로 직접 리디렉션할 수 있습니다.
다음과 같은 코드를 사용할 수 있습니다.
egrep -Rl '사용자. *로그|로그. *user' /home/moose/test | tr '\n' ' ' > 대용량 파일
그러면 다음이 제공됩니다.
/홈/무스/테스트/파일1 /홈/무스/테스트/2 /홈/무스/테스트/3 /홈/무스/무스/파일4
답변4
paste
- s
(직렬화) 옵션을 사용하여 모든 행을 단일 행으로 가져올 수 있습니다.
귀하의 경우:
grep .... | paste -sd'\t'
여기서는 -t
구분 기호를 의미하고, 여기서 탭 문자는 구분 기호로 사용되므로 필요에 맞게 변경하세요.
예:
% printf 'foo\nbar\nspam\negg\n'
foo
bar
spam
egg
% printf 'foo\nbar\nspam\negg\n' | paste -sd' '
foo bar spam egg
% printf 'foo\nbar\nspam\negg\n' | paste -sd'\t'
foo bar spam egg