경기가 끝날 때까지 grep 라인


12

나는 출력 다음 한 git status어떻게 작업을 수행 grep한 후 모든 것을를 Untracked files:

[alexus@wcmisdlin02 Test]$ git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   app/.gitignore
#   new file:   app/app.iml
#   new file:   app/build.gradle
#   new file:   app/proguard-rules.pro
#   new file:   app/src/androidTest/java/org/alexus/test/ApplicationTest.java
#   new file:   app/src/main/AndroidManifest.xml
#   new file:   app/src/main/java/org/alexus/test/MainActivity.java
#   new file:   app/src/main/res/layout/activity_main.xml
#   new file:   app/src/main/res/menu/menu_main.xml
#   new file:   app/src/main/res/mipmap-hdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-mdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-xhdpi/ic_launcher.png
#   new file:   app/src/main/res/mipmap-xxhdpi/ic_launcher.png
#   new file:   app/src/main/res/values-w820dp/dimens.xml
#   new file:   app/src/main/res/values/dimens.xml
#   new file:   app/src/main/res/values/strings.xml
#   new file:   app/src/main/res/values/styles.xml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   .idea/
#   Test.iml
#   build.gradle
#   gradle.properties
#   gradle/
#   gradlew
#   gradlew.bat
#   settings.gradle
[alexus@wcmisdlin02 Test]$ 

이처럼 -AGNU 의 매개 변수 와 같이 줄 수를 지정하지 않으면 grep:

[alexus@wcmisdlin02 Test]$ git status | grep -A100 'Untracked files'
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   .idea/
#   Test.iml
#   build.gradle
#   gradle.properties
#   gradle/
#   gradlew
#   gradlew.bat
#   settings.gradle
[alexus@wcmisdlin02 Test]$ 

그것을 할 수있는 방법이 있습니까?

[alexus@wcmisdlin02 Test]$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
[alexus@wcmisdlin02 Test]$ 

-A인수로 충분히 큰 숫자 를 사용할 수없는 이유는 무엇 입니까?
kasperd

답변:


17

GNU grep(버전 2.6.3에서 테스트) :

git status | grep -Pzo '.*Untracked files(.*\n)*'

용도 -P펄 정규 표현식은 -z또한으로 줄 바꿈을 일치하도록 \n하고 -o단지 패턴과 일치 무엇을 인쇄 할 수 있습니다.

정규식은 다음같이 설명했다 .

먼저 문자열이 나타날 때까지 모든 문자 ( .)를 0 번 또는 여러 번 일치 *시킵니다 Untracked files. 이제 대괄호 안의 부분 (.*\n)은 개행 ( .)이 0 또는 여러 번 ( *) 이고 개행 ( )을 제외한 모든 문자와 일치합니다 \n. 그리고 모든 것 (백셋 안에 있음)은 0 번 또는 여러 번 발생할 수 있습니다. 그것이 last의 의미입니다 *. 의 첫 번째 발생 후 이제 다른 모든 행과 일치해야합니다 Untracked files.


3
실제로를 사용하는 답변 grep, 감동합니다!
Hyppy

) 나도 @hyppy)하고 다시도 진화 펄 정규식과 일치
alexus

1
입력에 많은 줄이 있으면 잘 작동하지 않습니다. 우분투 14.04에서 테스트했으며 일치하는 길이가 약 8000 줄보다 길면 segfault입니다.
kasperd

2
@kasperd 8000 + 라인으로 생각 grep합니다. 올바른 도구는 아닙니다. 그러나 그렇지 않으면이 질문은 사용자가 관련 출력 만 볼 수 있다는 것 grep입니다.
혼돈

1
@ chaos 나는 또한 grep -A999999999 'Untracked files'경기 전 1000000 줄과 경기 후 1000000 줄을 테스트 했습니다. 그 접근법은 잘 작동했습니다. 그렇게 grep할 수 있습니다. 접근 방식의 문제점은 개별 행이 아닌 전체 파일에서 단일 일치를 수행하도록 강제한다는 것입니다.
kasperd

13

sed를 사용하지 않아도 가능한 해결책은 다음과 같습니다.

git status | sed -n -e '/Untracked files/,$p'

이것은 일반적인 UNIX grep 및 sed와 함께 작동하는 이점이 있지만 허용되는 솔루션에는 GNU grep이 필요합니다.
Guntram Blohm은 Monica를

3

나는 awk이것을 위해 사용할 것이다 :

git status | awk '/Untracked files/,0'

이것은 /Untracked files/,0범위 소진입니다. 처음 부터 True로 평가 Untracked files될 때까지 0True로 평가됩니다. 이런 일이 발생하지 않기 때문에 나머지 파일을 인쇄합니다.

참고 awk참에의 행동이 우리가하지 않는 이유의 명시 적으로 호출하는 것으로, (일반적으로, 선) 현재 레코드를 인쇄하는 것입니다 print.


2

시도해 볼 수 있습니다 :

git status | grep -A99 Untracked

여기서 -A경기 후 컨텍스트를 후행의 라인을 인쇄 할 것이다.

다른 방법으로 사용 more하거나 less, 예를 들면 :

git status | less +/Untracked

스크립팅 목적으로 ex/를 사용합니다 vi.

git status | ex -s +"/Untracked/norm d1G" +%p -cq! /dev/stdin

추적되지 않은 파일에 줄을 포함 시키려면 kd1G대신을 사용하십시오 d1G.

또는 배관없이 및 /dev/stdin구문은 다음과 같습니다 ex ... <(git status).


나는 -A원래의 질문에 포함했지만 more +/Untracked당신의 대답의 일부를 좋아 합니다.
alexus

@alexus 스크립트를 작성하는 경우에 해당하는 버전을 추가 ex했습니다 vi -e.
kenorb

감사합니다, 나는 믿습니다 more/ less매우 유용합니다)
alexus

1

괄호가있는 단일 라이너의 경우 서브 쉘을 생성하여 변수를 유지하지 않도록합니다.

(while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 ; \
   [[ "$MATCHED" = 1 ]] && echo "$LINE" ; done < <(git status))

당신은 그것의 끝에서 당신이 그것으로해야 할 다른 것에 파이프 할 수 있습니다.

또는 모든 쉘 스크립트에서 사용할 수 있습니다

while read LINE ; do
    [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1
    [[ "$MATCHED" = 1 ]] && echo "$LINE"
done < <(git status)

echo "$LINE"데이터로 원하는 것을로 바꿉니다 . "추적되지 않은 파일"줄을 건너 뛰려면 두 테스트 만 전환하십시오.


0

이와 같은 것을 사용할 수 있습니다 count = 1. 현재 줄의 일부 문자열과 일치하면 Perl을 사용 하고 while 루프가 끝나면 count 변수를 확인하고 일치하는 위치부터 마지막 ​​줄까지 줄 범위를 인쇄합니다. 선

ls -al | perl -e '@LINES = (); $n = 0 ; $nline = 0; while(<>){ push(@LINES, $_); $n++; if($_ =~ m/mirror/i) { $count = 1; $nline = $. - 1 };};  if($count != 0){ foreach $i($nline..$n-1){ print "\t$LINES[$i]\n";}}'

1
너무 복잡합니다. 간단한 Perl 솔루션이 여기 있습니다 : stackoverflow.com/a/18167194/111036 . 일치하는 줄을 포함하는 변형은 다음과 같습니다.perl -ne 'print if /Untracked files:/ .. 0'
mivk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.