다음 두 명령을 사용하여 동일한 결과를 얻었습니다.
[root@localhost ~]# grep line comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#
[root@localhost ~]# grep line <comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#
이 두 가지 중 하나가 서로 접근하면 장단점을 설명해 주시겠습니까?
답변
보내는 사람 man grep
(데비안) 페이지 :
기술
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN. By default, grep prints the matching lines.
첫 번째 경우 grep
파일을 엽니 다. 두 번째로, 쉘은 파일을 열고 표준 입력에 할당하며 grep
, grep
파일 이름 인수가 전달되지 않으면 표준 입력을 grep해야한다고 가정합니다.
1의 장점
grep
하나 이상의 파일을 grep 할 수 있습니다 ¹.grep
각 발생line
이 발견 된 파일 이름을 표시 할 수 있습니다 .
2의 장점
- 파일을 열 수없는 경우, 쉘은보다 관련성있는 정보 (스크립트의 줄 번호와 같은)와보다 일관된 방식으로 (쉘이 다른 명령을 위해 파일을 열도록 허용 한 경우) 오류를 반환합니다.
grep
그것을 엽니 다. 그리고 파일을 열 수 없으면grep
호출되지 않습니다 (일부 명령의grep
경우 큰 차이를 만들 수 있음). - 의
grep line < in > out
경우,in
캔을 열 수 없습니다,out
만들거나 절단되지 않습니다. - 비정상적인 이름 (예 :으로
-
시작하는 파일 이름-
) ²이 있는 일부 파일에는 문제가 없습니다 . - 외관 :
<file
원하는<in grep line >out
경우 명령 줄의 아무 곳에 나 배치 하여 명령 흐름을보다 자연스럽게 표시 할 수 있습니다. -
cosmetic : GNU
grep
에서는 다음과 같이 파일 이름 대신 일치하는 줄 앞에 사용할 레이블을 선택할 수 있습니다.<file grep --label='Found in file at line' -Hn line
성능면에서 파일을 열 수 없으면 grep
리디렉션 을 사용할 때 실행을 저장 하지만 그렇지 않으면 grep
큰 차이가 없습니다.
리디렉션을 사용하면에 추가 인수를 전달하지 않아도 grep
되므로 grep
인수 구문 분석이 약간 쉬워집니다. 반면에, 쉘은 dup2()
파일 디스크립터 0에 대한 파일 디스크립터에 대한 추가 시스템 호출을 적어도 필요 로합니다.
에서 { grep -m1 line; next command; } < file
, grep
(여기에 GNU 것은 grep
) 할 것 seek()
(가) 그래서 그냥 일치하는 행 다음에 백업 next command
파일의 나머지 부분을보고 (이 또한 파일이 시크인지 여부를 결정해야합니다). 다시 말해서, stdin 내의 위치는의 다른 grep
출력 중 하나입니다 . 을 사용 grep -m1 line file
하면이를 최적화 할 수 있습니다 grep
.
노트
¹를 사용 zsh
하면 다음을 수행 할 수 있습니다.
grep line < file1 < file2
그러나 cat file1 file2 | grep line
( cat
유틸리티 를 호출하지 않고) 동등한 기능을 수행 하므로 효율성이 떨어 지므로 첫 번째 파일이 줄 바꿈 문자로 끝나지 않고 패턴이 발견 된 파일을 알려주지 않으면 혼동을 일으킬 수 있습니다.
² ksh93
와 bash
같은 경우 /dev/tcp/host/port
(및 /dev/fd/x
일부 시스템에 bash
) 리디렉션 대상으로 사용될 때 셸이 실제로 파일 시스템에서 파일을 여는 대신 특수 목적으로 가로채는 파일이 있습니다 (일반적으로 해당 파일은 파일 시스템에 존재하지 않습니다). /dev/stdin
에 -
의해 인식되는 것과 동일한 목적을 수행 grep
하지만 적어도 여기에는 네임 스페이스가 더 적절합니다 ( -
모든 디렉토리에서 파일을 만들 수는 있지만 관리자 만 파일을 만들 수 /dev/tcp/host/port
있으며 관리자는 더 잘 알고 있어야 함).
답변
StephaneChazelas의 답변이 포함 grep(1)
되어 있으며 대부분의 유닉스 계보 명령은 그런 식으로 작동하지만 전부는 아닙니다. 표준 입력 (키보드,을 통해 경로 재 지정된 파일 < file
또는 다른 명령 (예 : 어리석은 예제 ls * | grep '^ab*c$'
)에 의해 파이프 된 출력 ) 또는 인수와 같은 파일 로 읽는 것이 표준 grep comment file1 file2 file3
입니다. 일부 명령 -
은 이름 이 지정된 파일 이 표준 입력 이라는 규칙을 사용 하므로 생성 된 모든 항목 과 뒤에 make-middle | cat head - tail
스트림을 가져올 수 있습니다 . 이것은 명령 사용에 유연성을 부여하기 위해 의도적으로 설계된 것입니다.head
gen-middle
tail
어떤게 더 좋아? 작동하는 cmd file
한보다 짧습니다 cmd < file
. 쉘이 파일 frobbing ( )을 수행하는 쉘 과 자체적으로 수행하는 명령 간에는 시간에 약간의 차이 가있을 수 <
있지만 하루 종일 다른 작업을 수행하지 않으면 눈에 띄지 않을 수 있습니다. Stephane의 답변에 언급 된 전문가와 같은 고려 사항에 달려 있습니다.