У меня есть следующий вывод от 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]$
Как это, но без указания количества строк, например -A
параметр в GNU 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]$
С GNU grep
(проверено с версией 2.6.3):
git status | grep -Pzo '.*Untracked files(.*\n)*'
Использует -P
для регулярных выражений Perl, -z
чтобы также сопоставить новую строку с \n
и -o
чтобы печатать только то, что соответствует шаблону.
Регулярное выражение объяснило:
Сначала сопоставляем любой символ (.
) ноль или несколько раз (*
) до появления строки Untracked files
. Теперь деталь внутри скобок (.*\n)
соответствует любому символу кроме новой строки (.
) ноль или несколько раз (*
), за которым следует новая строка (\n
). И все это (что внутри задников) может происходить ноль или несколько раз; в этом смысл последнего *
. Теперь он должен соответствовать всем остальным строкам после первого появления Untracked files
.
Если вы не против использования sed, вот возможное решение
git status | sed -n -e '/Untracked files/,$p'
я хотел бы использовать awk
для этого:
git status | awk '/Untracked files/,0'
это /Untracked files/,0
это выражение диапазона. Он оценивается как True с первого раза Untracked files
и пока 0
оценивается как True. Поскольку этого никогда не происходит, он распечатывает остальную часть файла.
Обратите внимание, что awk
поведение для True заключается в том, чтобы распечатать текущую запись (обычно строку), поэтому нам не нужно явно вызывать print
.
Вы можете попробовать:
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)
.
Для однострочника с круглыми скобками для создания подоболочки, чтобы избежать сохранения переменных:
(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"
что бы вы ни делали с данными. Если вы хотите пропустить строку «Не отслеживаемые файлы», просто переключите два теста.
вы можете использовать что-то вроде этого, я использовал Perl, следующий набор команд count = 1
если я сопоставляю некоторую строку в текущей строке, и когда цикл while завершен, я проверяю переменные счетчика и распечатываю диапазон строк, из которых происходит совпадение с последней строкой
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";}}'