2017-10-31 6 views
2

나는 창 명령 ICACLS C의 결과 인 다음과 같습니다 파일이 : \ 경로를/t> 경우 output.txtAWK는 이전 라인에 따라 라인에 빈 공간을 대체 할 나오지

C:\temp\2\ok Everyone:(I)(RX) 
       BUILTIN\Administrators:(I)(F) 
       NT AUTHORITY\SYSTEM:(I)(F) 
       BUILTIN\Users:(I)(RX) 
       NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
        BUILTIN\Administrators:(I)(F) 
        NT AUTHORITY\SYSTEM:(I)(F) 
        BUILTIN\Users:(I)(RX) 
        NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

빈 공간이 아닌 빈 공간을 채울 필요가있다. 좋은 점은 공백은 항상 앞의 줄을 기준으로 한 문자 수와 같습니다.

원하는 출력

나는이 같은 노력
C:\temp\2\ok Everyone:(I)(RX) 
    C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
    C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
    C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
    C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
    C:\temp\2\test1.ps1 BUILTIN\Administrators:(I)(F) 
    C:\temp\2\test1.ps1 NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\test1.ps1 BUILTIN\Users:(I)(RX) 
    C:\temp\2\test1.ps1 NT AUTHORITY\Authenticated Users:(I)(M) 

: 두 개의 파일을 구하는 함께 붙여 넣기하기 위해 를하지만 문제는 예상치 못한 공간의 alwats 내가 윈도우 AWK를 사용하고 있음을 나오지도하고 (순서를 나사이다 나는 따옴표)

awk "{line=$2} {print NF?line:\"\"}" OUTPUT 
    awk "{line=$1} {print NF?line:\"\"}" OUTPUT 
    awk -F":" "{line=$2} {print NF?line:\"\"}" OUTPUT 
    awk -F":" "{line=$1} {print NF?line:\"\"}" OUTPUT 

를 사용하는 이유는에 따라 다른 생각

+0

는 "첫 번째"라인이 실제로에서 왼쪽 정당화 다른 방법으로 AWK 해보자 파일 또는 공간이 있습니까? – ghoti

+0

그 공백이 실수로 추가되었습니다. 실제로 공백이 없습니다. – Eduardo

+0

@Eduardo : 시작 줄에 항상'Everyone : (I) (RX)'이 있습니까? – batMan

답변

0

의 진가를 알아볼 것입니다당신을 도울 것입니다.

awk '/^C:\\/{val=$1;print;next} NF{sub(/^ +/,"");print val,$0;next} 1' Input_file 

여기에 설명이 포함 된 비선형 솔루션을 추가하십시오.

awk ' 
/^C:\\/{   ##Checking condition here if any line starts from C:\\, point to be noted here I am escaping \ for removing its special meaning. 
val=$1;   ##If any line starts from C:\\ then it will be come in this block, assigning variable named val to first field here. 
print;   ##Printing that specific line now. 
next   ##next is to skip all further statements from this line onwards and move the cursor to next line with starting of the statements. 
} 
NF{    ##Checking condition here if any line is NOT NULL so NF means number of fields and checking of number of fields variable is NOT NULL, if yes then do following. 
sub(/^ +/,""); ##Substituting initial space with NULL in current line. 
print val,$0; ##Printing variable named val and current line now. 
next    ##Use next statement to skip further statements. 
} 
1    ##Mentioning 1 here to make the condition TRUE, so awk works on method of regexp and action, here I am making condition/regexp TRUE by mentioning 1 and not mentioning any action here so by default print of current line will happen. 
' Input_file  ##Mentioning Input_file name here. 
+1

대단히 감사합니다. 정확히 필요한대로 작동합니다. 방금 UNC 경로에 적용했습니다. – Eduardo

+0

@ 에두아르도, 그것이 당신을 도왔다, 계속 배우고, 공유하고, 환호를 지키는 것이 기쁘다! – RavinderSingh13

3

awk the rescue!

awk '/^$/{k=""} !k{k=$1;$1=""} {sub(/^ +/,k FS)}1' 


C:\temp\2\ok Everyone:(I)(RX) 
C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok BUILTIN\Users:(I)(RX) 
C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\ok.txt Everyone:(I)(RX) 
C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\ok1.txt Everyone:(I)(RX) 
C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\ok2.txt Everyone:(I)(RX) 
C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

C:\temp\2\test1.ps1 Everyone:(I)(RX) 
C:\temp\2\test1.ps1 BUILTIN\Administrators:(I)(F) 
C:\temp\2\test1.ps1 NT AUTHORITY\SYSTEM:(I)(F) 
C:\temp\2\test1.ps1 BUILTIN\Users:(I)(RX) 
C:\temp\2\test1.ps1 NT AUTHORITY\Authenticated Users:(I)(M) 

Windows 형식에 적응해야 할 수도 있습니다.

+0

감사합니다. 완벽하게 작동합니다. – Eduardo

1

나는 자신을 싫어하므로 자신을 sed만을 사용하여 해결하기로 결심했습니다. 그것은 전적으로 가능 밝혀 :

$ cat /tmp/test.sed 
h 
:first 
n 
s/^\s*$/&/ 
t last 
H 
s/^// 
t first 
:last 
x 
:loop 
s/^(.*)(Every.*)(\1[^\n]*)$/\1\2\3/ 
t break 
s/(.*)(Every[^\n]*)((\n\1[^\n]*)*)\n\s*/\1\2\3\n\1/ 
t loop 
:break 
p 
g 
p 

그것은 확실히 결과를 얻을 수 :

h # overwrite hold buffer with current line 
:first # set a label 
n # overwrite current line(pattern buffer) with next line 
s/^\s*$/&/ # are we currently in blank line? 
t last # if so, we jump to :last, continue otherwise 
H # we append current line to hold buffer 
s/^// # always true 
t first # so we will be going back to :first 
:last 
x # so now we have all lines related to the single file. then we xchange the hold buffer to pattern buffer 
:loop # we need to loop to loop through all lines 
s/^(.*)(Every.*)(\1[^\n]*)$/\1\2\3/ # have we substituted all lines yet? 
t break # if so, we break the loop, continue otherwise 
s/(.*)(Every[^\n]*)((\n\1[^\n]*)*)\n\s*/\1\2\3\n\1/ # then we make sure each iteration will replace leading blanks with file path 
t loop # go back to the beginning of the loop 
:break 
p # we print all we have now substituted 
g # get back the blank line 
p # print the blank line 

이 코드는 자동으로 적응 임의의 라인과 같은 속성 : 내 비밀 솔루션의

$ sed -n -r -f /tmp/test.sed /tmp/try 
    C:\temp\2\ok Everyone:(I)(RX) 
    C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
    C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
    C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
    C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

설명은 다음 이동을 빈 줄로 구분되어있는 한 그러한 형식의 별로 나쁘지 않은가요? 원할 경우 개선하도록 도와주세요.

+0

대단히 감사합니다. 현재 디렉토리에서 작동하지만이 파일 안에 3 개의 슬래시와 같은 패턴을 따르지 않는 많은 폴더가 있습니다. 두 번째 줄의 텍스트가 나타날 때까지 위쪽 줄에서 빈 줄이있는 줄까지 동일한 문자를 복사 할 수 있습니까? \t \t C : 새 폴더 BUILTIN \ 관리자 \ : \ temp와 (나) (F) \t \t BUILTIN \ 관리자 : (I) (OI) (CI) (IO) (F) \t \t 예를 들어 NT AUTHORITY \ SYSTEM : (I) (F) – Eduardo

+0

@Eduardo 내가 말했듯이이 코드는 각 파일이 빈 줄로 구분되어있는 한이 형식을 채택합니다. 경로에 3 개의 슬래시가 있다고 가정합니다. – HuStmpHrrr

+0

그것은이 질문의 텍스트가 포함 된 파일에서 작동하는 것이 이상한 일이지만 C : \ new 폴더 또는 C : \ temp \ new 폴더와 같은 폴더가 있으면 빈 공간이 남습니다. – Eduardo

0

또는 예상되는 출력에 주어진 바와 같이 시작 부분에 공백이있는 경우에도 마찬가지입니다.

awk '{/C:/? s=$1 : NF ? $0 = s OFS $0 : ""; $1= " "$1 }1' infile 

테스트 결과 :

$ cat infile 
    C:\temp\2\ok Everyone:(I)(RX) 
       BUILTIN\Administrators:(I)(F) 
       NT AUTHORITY\SYSTEM:(I)(F) 
       BUILTIN\Users:(I)(RX) 
       NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
        BUILTIN\Administrators:(I)(F) 
        NT AUTHORITY\SYSTEM:(I)(F) 
        BUILTIN\Users:(I)(RX) 
        NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
         BUILTIN\Administrators:(I)(F) 
         NT AUTHORITY\SYSTEM:(I)(F) 
         BUILTIN\Users:(I)(RX) 
         NT AUTHORITY\Authenticated Users:(I)(M) 

출력 :

$ awk '{/C:/? s=$1 : NF ? $0 = s OFS $0 : ""; $1= " "$1 }1' infile 
    C:\temp\2\ok Everyone:(I)(RX) 
    C:\temp\2\ok BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok.txt Everyone:(I)(RX) 
    C:\temp\2\ok.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok1.txt Everyone:(I)(RX) 
    C:\temp\2\ok1.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok1.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok1.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok1.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\ok2.txt Everyone:(I)(RX) 
    C:\temp\2\ok2.txt BUILTIN\Administrators:(I)(F) 
    C:\temp\2\ok2.txt NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\ok2.txt BUILTIN\Users:(I)(RX) 
    C:\temp\2\ok2.txt NT AUTHORITY\Authenticated Users:(I)(M) 

    C:\temp\2\test1.ps1 Everyone:(I)(RX) 
    C:\temp\2\test1.ps1 BUILTIN\Administrators:(I)(F) 
    C:\temp\2\test1.ps1 NT AUTHORITY\SYSTEM:(I)(F) 
    C:\temp\2\test1.ps1 BUILTIN\Users:(I)(RX) 
    C:\temp\2\test1.ps1 NT AUTHORITY\Authenticated Users:(I)(M) 
+0

고맙습니다. 파일/폴더에 예 : C : \ New Folder \ subfolder \ New text file.txt와 같은 공백이있는 경우에도 작동하게 할 수 있습니까? – Eduardo

0

는 이제

awk '{ 
if(/^C:\\temp/) {x=$1;print} 
else if(/[:alpha]/) {gsub(/^[ \t]+/," "); print x $0} 
else print;  
}' ipfile