동일한 결과를 생성하는 다음 두 명령을 사용하고 있습니다.
[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 ~]#
이 두 가지 방법이 서로 대체 가능한 경우 장점/단점을 설명해 주세요.
답변1
man grep
페이지 에서 (Debian의 경우):
설명하다
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할 수 있습니다1.grep
파일 이름이 나타날 때마다 표시될 수 있습니다line
.grep
fadvise(POSIX_FADV_SEQUENTIAL)
열려 있는 파일 설명자에 대해 작업을 수행하는 것이 가능합니다²(그러나 구현에 대해서는 알지 못합니다).
2의 장점:
파일을 열 수 없는 경우, 쉘은 보다 관련 있는 정보(예: 스크립트의 행 번호)가 포함된 오류를 반환하고 보다 일관된 방식으로 파일을 엽니다(쉘이 다른 명령을 위해 파일을 열도록 허용한 경우). )
grep
. 파일을 열 수 없으면grep
호출조차 되지 않습니다(일부 명령의 경우 - 아닐 수도 있지만grep
- 큰 영향을 미칠 수 있음).grep line < in > out
, 열 수 없는 경우 생성in
되거나out
잘리지 않습니다.-
특이한 이름(예: 또는 로 시작하는 파일 이름)을 가진 일부 파일에는 문제가 없습니다-
.장식: 원하는 경우
<file
명령줄의 아무 곳에나 배치하여 명령 흐름을 보다 자연스럽게 표시할 수 있습니다.<in grep line >out
외관: GNU를 사용하면
grep
다음과 같이 파일 이름뿐만 아니라 일치하는 줄 앞에 사용할 태그를 선택할 수 있습니다.<file grep --label='Found in file at line' -Hn line
성능 측면에서는 grep
파일을 열 수 없는 경우 리디렉션을 사용할 때 실행을 저장할 수 있지만 그 외에는 grep
큰 차이가 없을 것으로 예상됩니다.
리디렉션을 사용하면 추가 매개변수를 에 전달할 필요가 없으므로 매개변수 구문 분석이 약간 더 쉬워 grep
집니다 grep
. 반면, 쉘은 파일 dup2()
설명자를 파일 설명자 0으로 전송하기 위해 파일 설명자에 대해 (적어도) 추가 시스템 호출을 수행해야 합니다.
(여기서는 GNU ) 파일의 나머지 부분을 볼 수 있도록 일치하는 줄 뒤로 돌아가기 를 원할 { grep -m1 line; next command; } < file
것입니다 (파일이 검색 가능한지 여부도 결정해야 합니다). 즉, stdin의 위치는 또 다른 출력입니다. 이를 통해 이를 최적화할 수 있으며 걱정할 것이 하나 줄어듭니다.grep
grep
seek()
next command
grep
grep -m1 line file
grep
노트
이를 사용하여 zsh
다음을 수행할 수 있습니다.
grep line < file1 < file2
그러나 이는 유틸리티를 cat file1 file2 | grep line
호출하지 않는 cat
것과 같기 때문에 효율성이 떨어지며 첫 번째 파일이 개행으로 끝나지 않고 어떤 파일에서 패턴이 발견되었는지 알려주지 않으면 혼란을 일으킬 수 있습니다.
grep
² 이는 I/O 스케줄러가 데이터를 읽는 방법과 같은 더 많은 정보를 바탕으로 결정을 내릴 수 있도록 파일을 순서대로 읽도록 시스템에 알려줍니다 . grep
이걸 할 수 있어내 자신의fd, 하지만 fd 0에서 이 작업을 수행하는 것은 잘못된 것입니다.빌리다fd와 같은 호출자로부터 (또는 오히려파일 설명 열기참조)는 나중에 또는 동시에 비순차 읽기에 사용할 수 있습니다. 그러나 실제로는 GNU가 sort
여전히 이 작업을 수행한다는 것을 알 수 있습니다.
ksh93
3 및 (및 의 일부 시스템 ) 의 경우 리디렉션 대상에서 사용될 때 실제로 파일 시스템에서 파일을 여는 대신 특수 목적으로 셸에서 가로채는 bash
유사한 파일이 있습니다 . 이러한 파일은 파일 시스템에 존재하지 않습니다.) 식별된 목적과 동일 하지만 적어도 여기서는 네임스페이스가 더 적합합니다(누구나 모든 디렉터리에 이름이 지정된 파일을 만들 수 있지만 관리자만 이름이 지정된 파일을 만들 수 있으므로 관리자는 더 잘 알아야 합니다)./dev/tcp/host/port
/dev/fd/x
bash
/dev/stdin
-
grep
-
/dev/tcp/host/port
답변2
StephaneChazelas의 답변은 이를 다루고 grep(1)
있으며 대부분의 Unix 계보 명령은 이런 방식으로 작동하지만 전부는 아닙니다. 표준 읽기 방법은 표준 입력(키보드, 리디렉션을 통한 파일 < file
또는 다른 명령의 파이프된 출력, 어리석은 예 ls * | grep '^ab*c$'
) 또는 인수로 제공된 파일(예: )에서 읽는 것입니다 grep comment file1 file2 file3
. 일부 명령은 명명된 파일이 -
표준 입력이라는 규칙을 사용하므로 생성된 모든 항목을 make-middle | cat head - tail
사용하여 스트림을 가져온 다음 명령을 보다 유연하게 사용할 수 있도록 설계되었습니다.head
gen-middle
tail
어느 것이 더 낫습니까? 작동하는 한 다음 cmd file
보다 짧을 cmd < file
수 있습니다.매우 작은쉘이 파일을 frobbing( ) <
하는 것과 명령 자체가 이를 수행하는 사이의 시간 차이는 있지만 하루 종일 다른 작업을 하지 않는 한 눈에 띄지 않을 것입니다. 이는 Stephen의 답변에 언급된 장점과 같은 고려 사항에 따라 달라집니다.