![특정 문자의 인스턴스를 포함하는 모든 줄을 Grep](https://linux55.com/image/176290/%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%9D%98%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%A5%BC%20%ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94%20%EB%AA%A8%EB%93%A0%20%EC%A4%84%EC%9D%84%20Grep.png)
한 줄에 "#"이 하나만 있는 모든 줄을 grep하고 싶습니다.
예:
xxx#aaa#iiiii
xxxxxxxxx#aaa
#xxx#bbb#111#yy
xxxxxxxxxxxxxxxx#
xxx#x
#x#v#e#
이 출력을 제공해야합니다
xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x
답변1
노력하다
grep '^[^#]*#[^#]*$' file
어디
^ ; begin of line
[^#]* ; any number of char ≠ #
# ; #
[^#]* ; any number of char ≠ #
$ ; end of line
제안한 대로 전체 라인을 grep할 수 있습니다.
grep -x '[^#]*#[^#]*'
그리고
- 라인 앵커의 시작/끝이 없는 동일한 패턴입니다.
-x
전체 줄을 grep하려면 다음을 참조하세요.man grep
-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
답변2
사용 awk
:
awk -F'#' 'NF==2' infile
필드 구분자를 기준으로 #
한 줄의 필드 수가 정확히 2개 필드인 경우 인쇄됩니다. 예를 들어 #x
또는 x#
심지어 #
는 두 개의 필드로 처리됩니다.
답변3
두 번의 호출 grep
: 1개 이상의 행을 선택한 #
다음 2개 이상의 행을 삭제합니다.
grep '#' filename | grep -v '#.*#'
답변4
awk
조건부 블록에서 gsub 함수를 사용하여 행을 선택할 수 있습니다 .
$ awk 'gsub(/#/, "#") == 1' file
$ awk '/#/ && ! /#.*#/' file
$ sed -ne 's/#/&/2;t' -e '//p' file
- sed 명령과 옵션으로 인해 최소 2줄은
#
인쇄되지 않습니다.t
-n
- 이렇게 하면 행에 정확히 하나의 # 또는 없음이 남게 됩니다. //를 사용하여 전자를 인쇄하십시오.
perl
줄을 감지하기 위해 스칼라 컨텍스트의 문자 수를 계산할 수 있습니다 .#
$ perl -ne 'print if tr/#/#/ == 1' file