Bash: find, cat, grep 집중 공략, 아래의 내용을 유심히 보면서 공부하면 됩니다.

입질쾌감 물때표
find /etc -type f -exec cat '{}' \;

어디에서 자주봤던 명령어입니다. find 커맨드로 /etc 디렉토리에서 type이 파일인것들을 찾아서 -exec(실행) 시켜주세요 – 라는 의미이다.
{}가 의미하는것은 find에서 찾은 파일을 말하는 것입니다. 그파일을 다음과 같은 커맨드로 실행시켜 달라는 것!!.

cat filename

그런데 “\;” 라는 표기가 있는데 이건 뭔가하면 스크립트의 종료를 의미한다. 쉽게 이야기 하면 exec 커맨드가 bash에서 실행될때에는 “\;” 라는 표기자를 만날때까지 읽고 실행시킨다. find 커맨드만 특이하게 저걸 사용하는게 아니다. 저 “\;”가 없으면 어떻게 되는가? 당연히 커맨드가 안먹는다. 아래에 잘 설명 되어있는 내용이 있어 함께 기록해 둔다. “\;” 만 있는게 아니라 “+”도 있다는 걸 알려줌.

Manpage의 내용

Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;’ is encountered. The string `{}’
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find.

exec에 대한 find 커맨드의 설명이다. exec는 ‘;’를 만날때까지 커맨드를 읽고 실행한다. 이때에 {}를 만나면 현재의 진행되고 있는 파일이름으로 대체해준다. 따라서 \;로 표기하는 이유는 만약 ‘;’만 있다면 find의 exec옵션은 커맨드가 끝이라는 것을 알려주는 것으로 보면 된다.  즉, exec 0를 처리해 주는게 “\;”라고 보면 될것 같다.

Given that the command find gets below three files:

fileA
fileB
fileC

If you use -exec with a plus(+) sign,

find . -type f -exec chmod 775 {} +

it will be:

chmod 775 fileA fileB fileC

The command line is built by appending each matched file name at the end, which is in the same way that xargs builds its command lines. The total number of invocations of the command (chmod, in this case) will be much less than the number of matched files.

If you use -exec with a semicolon(;),

find . -type f -exec chmod 775 {} \;

it will be:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC

활용되는 다른 예제

find ./ -maxdepth 1 -name "examples.desktop" -exec cat {} \;

설명: 현재 디렉토리의 하위레벨 1, 즉 동일한 위치의 디렉토리에서 examples.desktop 파일을 찾아서 cat 으로 보여달라 – 라는 의미이다.

 

grep에서 패턴 매칭되는 것만 가져오기

-o 옵션 : 매칭이 되는 문자열만 출력한다.
-E 옵션 : 정규식을 사용한다.
grep -oE “(^|[?&])id=[0-9]+”

# WR 텍스트 또는 Soft 텍스트가 포함된 라인은 모두 출력하지 않음
grep -v “\(WR\|Soft\)”

 

문자열 검색

@@ 필요한 확장자만 검색 후 문자열 검색
find . -type f -iname “*.c” -exec grep “hopper” {} \;
grep -r blah . –include “*.txt”

@@ 매칭된 검색명에서 이름만 출력
find ./ -name “*.py” -type f | grep -v .svn | xargs grep -l -n “404”

@@ MAXDEPTH 활용
find -maxdepth 3 -type d -ls | grep chrome

 

find로 파일 수정날짜 기준으로 검색하기

@@ 20일 전안에 수정된 파일 찾기

find . -mtime -20 -type f

 

@@ 파이썬에서 날짜 계산하기

import datetime
today = datetime.date.today()
someday = datetime.date(2014, 07, 14)
diff = someday - today
diff.days

 

 

파일만 검색하여 이동하기

find . -maxdepth 1 -type f -exec mv {} IPHONE/ \;

 

ps | grep 으로 프로세스 자신은 빼기

ps aux | grep dacom 이라고 하면 자신이 입력한 “grep dacom”이라는 프로세스가 검색되서 나오니
“grep [d]acom”이라고 하면 자신은 나오지 않게 된다. 화면에 출력은 grep [d]acom이라고 나오고
실제 검색 명령은 grep dacom을 검색할것이니..

 

find, grep 사용방법

@@ 파일내 스트링 검색
find ./ -name “*.txt” -exec grep “string” ‘{}’ \; -print
grep -R loginCommon.sis –include “*.jsp” .
[유닉스에서]
grep -e “주민” ./E*

 

파일이 일치하는지 알아보는 방법

cmp -b TEST/407310.xml TEST/407311.xml > /dev/null
echo $?

 

일치하지 않는 패턴을 찾는 방법

find ./ ! -name “*.xml”
uniq 사용방법 – 중복방지

@@ uniq 명령 : 출력중에 중복되지 않게 해준다.

 

find 와 xargs 사용방법

@@ -I : {}변수를 다른 이름으로 대체해서 사용할수 있다.
@@ -0 : 마지막 문자를 뉴라인 문자로 만들지 않는다. 왜냐하면 엔터키가 먹혀있으면 인라인 명령에서 다수의 목록들을 던져줄 수 없기 때문에

find . -name "*.java" -print0 | xargs -0 -I file echo file

ex) find ./ -name “*.un~” -print0 | xargs -0 -I list svn remove list

@@ 그러나 다음과 같은 상황에서는 마지막 NEW LINE 문자가 필요 (단한개의 파일만을 플레이)

find . -iname "*.mp3" -print | xargs mplayer

@@ 다수파일 재생

find . -iname "*.mp3" -print0 | xargs -I playlist -0 mplayer playlist

@@ 파라미터 사용하는 방법들

find . -iname "*.mov" -printf "%p %f\n" | while read -a HR ; do echo ffmpeg -i ${HR[0]} -f flv ${HR[1]} ;done

@@ 필드처럼 사용방법

echo "'param 1' 'param 2'" | xargs -n1

@@ 파라미터 2개이상 사용법

sudo apt-get install parallel
(echo 'param 1'; echo 'param 2') | parallel -N2 echo '\[{1}] \[{2}]'

p=(`echo "param1 param2"`); echo ${p[0]} ${p[1]}
(echo 'param 1'; echo 'param 2'; echo 'param 3'; echo 'param 4') | while read line1; read line2; do echo "[$line1] [$line2]"; done

@@ pass white space etc to xargs command

svn status -u | grep "*" | grep -v "POC\/" | xargs -0 echo
svn status -u | grep "*" | grep -v "POC\/" | xargs -0 echo | awk '$1=="*"{ print $3 } $i!="*"{ print $4 }' | xargs echo

@@ svn auto update

svn update `svn status -u | grep "*" | grep -v "POC\/" | xargs -0 echo | sed s/^\ /N/ | awk -F" " '{ print $4 }' | xargs echo`

@@ svn auto commit

svn commit -m "refs #0000 NEW COMMIT" `svn st | grep "M" | awk '{ print $2 }' | xargs echo`
svn commit -m "refs #0000 NEW COMMIT" `svn st | grep "^A" | awk '{ print $2 }' | xargs echo`

@@ svn auto update DELIVERY

svn update `svn status -u | grep "*" | xargs -0 echo | sed s/^\ /N/ | awk -F" " '{ print $4 }' | xargs echo`
find ./ -name "*.py" -print | xargs cat | grep -Hn "HTTPConnection"
find ./ -name "*.py" -exec grep "HTTPConnection" {} \; -print

 

와일드카드 사용하기

find / -name \*.html -print

 

파일 인코딩 알아내기

file -bi 쿼리샘플_SMS_MMS.txt | sed -e 's/.*[ ]charset=//'

 

텍스트 파일 인코딩 바꾸기

iconv -f euc-kr -t utf-8 쿼리샘플_SMS_MMS.txt

 

전체 인코딩 바꾸기

#!/bin/sh
files=$(find . -type f \( -name "*.py" -o -name "*.html" \))
files=$(find . -type f -name "*.java")
files=$(find . -type f \( -name "*.xml" -o -name "*.java" \))
for file in $files; do
    iconv -c -f euckr -t utf8 $file > $file.tmp && mv -f $file.tmp $file
done
exit 0

 

find . -type f \( -name "*.py" -o -name "*.html" \)
files=$(find . -type f -name "*.aspx"); for file in $files; do iconv -c -f euckr -t utf8 $file > $file.tmp && mv -f $file.tmp $file; done
files=$(find . -type f -name "*.htm"); for file in $files; do iconv -c -f euckr -t utf8 $file > $file.tmp && mv -f $file.tmp $file; done

 

find로 찾은 파일 tar로 묶기

(-type f를 반드시 넣어야 한다. ‘.’ 현재 디렉토리 찹조를 없애야 하기 때문)

find . -mtime -50 -type f | tar cvfz ../ANDROID_20131007.tar.gz -T -

 

SVN 숨은 파일 삭제

find ./ -name *.svn* -print0 | xargs -I playlist -0 echo playlist
find ./ -name *.svn* -print0 | xargs -I playlist -0 rm -rf playlist
find ./ -name *.svn -print0 | xargs -I playlist -0 rm -rf playlist

 

용량큰 파일 찾기

find [디렉토리] -size +1000k -exec ls -al {} \;
find ./ -size +1G -exec ls -al {} \;

 

7일 지난 파일 찾기

find [디렉토리] -ctime +7 -exec rm -f {} \;

 

디렉토리 내의 파일 검색하기

find /usr/local/httpd/conf/ -type f | xargs grep _default

 

grep OR 문법 사용하기

current_process_count=`ps -ef | egrep -i "android|smart" | grep -v egrep | wc -l`;

 

파일검색해서 모두 다른이름으로 바꾸기

@@ -depth 옵션을쓰면 정렬옵션을 무시한다.
find ./ -maxdepth 1 -name ‘IMG*’
@@ find에서 패턴을 이용한 방법으로 검색 할때에는 “Pattern substitution”이라는 기능을 찾아볼것
find ./ -depth -name ‘IMG*’ -execdir bash -c ‘mv “$1” “${1//0/9}”‘ _ {} \;
** 파일명중에서 0이라는 문자를 9로 대체한다.

 

grep 정규표현식 사용

^ 라인의 첫 글자 ^a a자로 시작하는 라인
$ 라인의 끝 글자 a$ a자로 끝나는 라인
. 한 글자 a…b a와 b 사이에 3 글자가 있는 단어
* * 기호 바로 이전의 글자나 정규 표현식이
0회 이상 반복
abc* c가 0번 이상 반복
ab, abc, abcc, abccc 등
[ ] 한글자를 대체할 글자의 목록을 []에 나열, “¦”를 여러 개 쓴 것과 같은 의미
“-” 기호와 함께 쓰면 문자의 범위를 지정할 수 있음
[abc]d ad, bd, cd를 뜻함, a,b,c 중 어떤 한 글자라도 반드시 있는 단어
“[a-z]”는 a부터 z까지 중 하나, “[1-9]”는 1부터 9까지 중의 하나를 뜻함
[^] 한글자를 대체하지 못할 글자의 목록을 [^ ]에 나열
“-” 기호와 함께 쓰면 문자의 범위를 지정할 수 있음
[^abc]d ad, bd, cd는 포함하지 않고 ed, fd 등을 포함
[^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 나타냄

+ + 기호 바로 이전의 글자나 정규 표현식이
1회 이상 반복
abc+ c가 1회 이상 반복 : abc, abcc, abccc 등
? ? 기호 바로 이전의 글자나 정규 표현식이
없거나 1회만 존재
abc? c가 없거나 한번만 존재 : ab, abc
() 부분 정규 표현식의 시작과 끝을 표시 a(bc)*
a(bc)+
a(bc)? bc가 0회 이상 반복 : a, abc, abcbc 등
bc가 1회 이상 반복 : abc, abcbc 등
bc가 있거나 없거나 : a, abc
¦ ¦로 구분된 단어들 중 최소 하나가 존재 a(b¦c) b 또는 c가 최소 하나 존재 : ab, ac, abc, acb
{m,n} {} 기호 바로 이전의 글자나 정규 표현식이
m개 이상 n개 이하 반복
a{1,3}b ‘ab’, ‘aab’, ‘aaab’를 포함하지만,
‘b’나 ‘aaaab’는 포함하지 않음

 

Perl 방식 정규표현식 검색

HTML 전체에서 NewLine을 포함한 패턴 찾기, <tr> 태그에서 </tr>로 끝나는 부분만 검색
curl -s http://info.finance.naver.com/marketindex/exchangeList.nhn | iconv -f euc-kr -t utf-8 | awk “/<tr>/,/<\/tr>/”

 

sed 활용

sed ‘:a;N;$!ba;s/\n/ /g’ file

sed 라벨 방법 알아보기
:a create a label ‘a’
N append the next line to the pattern space
$! if not the last line, ba branch (go to) label ‘a’
s substitute, /\n/ regex for new line, / / by a space, /g global match (as many times as it can)

 

PDF grep 하는 방법

sudo apt-get install pdfgrep
find ./ -iname '*.pdf' -exec pdfgrep "cron" {} \;

find ./ -iname '*.pdf' -exec pdfgrep -nH "공백" {} \;
== 동일 : find ./ -iname '*.pdf' -exec pdfgrep -n "공백" {} +

 

grep에서 필요한 부분만 그룹화 해서 출력하는 방법

cat sample.txt | grep -oP '(?<=div ).*(?=>)'

Positive/Negative Lookbehind (?<=) 또는 (?<!) 을 사용해서 앞의 조건을 설정하고
Positive/Negative Lookahead (?=) 또는 (?!)를 사용해서 뒤의 조건을 설정한다

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다