반응형

find는 실제로 리눅스 시스템에서 아주 많이 즐겨 쓰는 명령어 입니다. 

 

이런 명령어를 이용해서 무엇을 할 수 있는지 예제를 통해서 알아보는 시간을 갖도록 하겠습니다.

 

1) find를 이용해서 특정 파일의 특정 문자열 검색

 

find를 이용해서 Souce 코드를 분석 할 수 있습니다. 비단 소스코드 뿐만 아니라 아래 방법을 활용하면 리눅스 시스템에서 보다 쉽게 로그 파일 분석 및 기타 로그 파일을 분석 할 수 있습니다. 

 

find ./ -name "특정 파일 패턴" |xargs grep -n '찾고자 하는 문자열'

root@test:/mnt/linux_kernel/linux-4.19.62# find ./ -name "*.c" |xargs grep -n 'nvme_cmd_write'
./drivers/nvme/host/core.c:602: cmnd->rw.opcode = (rq_data_dir(req) ? nvme_cmd_write : nvme_cmd_read);
./drivers/nvme/host/core.c:1109:        case nvme_cmd_write:
./drivers/nvme/host/trace.c:122:        case nvme_cmd_write:
./drivers/nvme/host/trace.c:123:        case nvme_cmd_write_zeroes:
./drivers/nvme/target/io-cmd-file.c:94: if (req->cmd->rw.opcode == nvme_cmd_write) {
./drivers/nvme/target/io-cmd-file.c:321:        case nvme_cmd_write:
./drivers/nvme/target/io-cmd-file.c:337:        case nvme_cmd_write_zeroes:
./drivers/nvme/target/io-cmd-bdev.c:72: if (req->cmd->rw.opcode == nvme_cmd_write) {
./drivers/nvme/target/io-cmd-bdev.c:227:        case nvme_cmd_write:
./drivers/nvme/target/io-cmd-bdev.c:240:        case nvme_cmd_write_zeroes:
./drivers/nvme/target/admin-cmd.c:162:  log->io

cs[nvme_cmd_write]               = cpu_to_le32(1 << 0);
./drivers/nvme/target/admin-cmd.c:165:  log->iocs[nvme_cmd_write_zeroes]        = cpu_to_le32(1 << 0);

2) 특정 파일 사이즈 크기 삭제 / 복사 /이동 하기

 

find ./  -size +"파일크기"|while read line; do [리눅스 Command] $line ; done

 

이 해당 명령어를 설명하면 다음과 같습니다.

반응형

'리눅스 쉘 스크립트' 카테고리의 다른 글

awk 명령어 예제  (0) 2018.01.16
awk 사용법  (0) 2018.01.16
find 사용하기  (0) 2018.01.15
grep 으로 다중 문자열 검색  (1) 2018.01.15
grep 정규 표현식 패턴 예제 두 가지  (0) 2018.01.15
반응형

awk 명령어

awk '/west/' datafile : west 라는 글이 있는 줄 출력
awk '/^north/' datafile : north로 시작하는 줄 출력
awk '/^(no | so)/' datafile : no 또는 so 로 시작하는 줄 출력
awk '{ print $3, $2 }' datafile : datafile 리스트의 세 번째 와 두 번째 필드를 스페이스로 띄어서 출력
awk '{ print $3 $2 }' datafile : datafile 리스트의 세 번째 와 두 번째 필드를 그냥 붙여서 출력 
awk '{ print "Number of fields : " NF} ' datafile : datafile의 각 줄마다의 필드수를 리턴한다.
awk '$5 ~ /\.[7-9]+/' datafile : 다섯 번째 필드가 마침표 다음엣 7과 9사이 숫자가 하나 이상 나오는 레코드 출력
awk '$2 !~ /E/ { print $1, $2 }' datafile : 두 번째 필드에 E 패턴이 없는 레코드의 첫 번째와 두 번째 필드 출력
awk '$3 ~ /^Joel/{ print $3 " is a nice guy."} ' datafile : 세 번째 필드가 Joel로 시작하면 " is a nice guy"와 함께 출력
awk '$8 ~ /[0-9][0-9]$/ { print $8 }' datafile : 여덟 번째 필드가 두 개의 숫자이면 그 필드가 출력
awk '$4 ~ /Chin$/ { print "The price is $" $8 "." }' datafile : 네 번째 필드가 Chine으로 끝나면 "The price is $" 8번 필드 및 마침표가 출력
awk -F: '{ print $1 } ' datafile : -F 옵션은 입력 필드를 ':'로 구별.
awk -F"[ :]" '{ print $1, $2 } ' datafile : 입력 필드로 스페이스와 ':'를 필드 구별자로 사용
awk -f awk_script.file datafile : -f 옵션은 awk 스크립트 파일 사용할 때 씀.


awk '$7 == 5' datafile : 7번 필드가 5와 같다면 출력
awk '$2 == "CT" { print $1, $2 }' datafile : 2번 필드가 "CT" 문자와 같으면 1, 2 번 필드 출력
awk '$7 < 5 { print $4, $7}' datafile : 7번 필드가 5보다 작다면 4번, 7번 필드 출력
awk '$6 > .9 { print $1, $6}' datafile : 6번 필드가 .9 보다 크다면 1번, 6번 출력
awk '$8 > 10 && $8 < 17 ' datafile 
awk '$2 == "NW" || $1 ~ /south/ { print $1, $2 }' datafile

반응형

'리눅스 쉘 스크립트' 카테고리의 다른 글

Find 응용  (0) 2019.08.21
awk 사용법  (0) 2018.01.16
find 사용하기  (0) 2018.01.15
grep 으로 다중 문자열 검색  (1) 2018.01.15
grep 정규 표현식 패턴 예제 두 가지  (0) 2018.01.15
반응형

 1. awk ?
awk는 데이터 양식이나 문서나 혹은 자료를 처리하여 다른 형태의 문서 또는 결과물을 출력하는데 사용한다.

2. awk 의 구조
  - 시작 (BEGIN) : 입력데이터를 실행하기에 적합한 형태로 바꾸어 주는 단계
  - 실행 (Routine) : 잘 덩리된(정규화된) 데이터를 실제 루틴으로 처리하는 단계
  - 종료 (END) : 데이터가 처리된 후에 결과의 추가 출력

3. awk 의 사용
일반적으로 grep 과 같이 사용된다.

  1. grep 을 이용하여 데이터 파일의 구조 확인
  2. 정규화가 가능하지를 확인하고 sed로 테스트 한후에 awk 가 처리할수 있을정도로 
     정규화되있다면 awk를 사용
  3. sed로 정규화된 양식을 awk 로 처리

■■■■ ■■ ■■■■ ■ ■■■■■■■ ■
■■ ■■ ■■ ■■ ■■■■■■■■■ ■■
■■■■■■■■■■ ■■ ■■ ■■ ■ ■ 

위의 데이터 형식은 아래의 형식으로 바뀌게 된다.
R1  ■■■■                ■■ ■■■■ ■    ■■■■■■■      ■
R2  ■■                     ■■ ■■      ■■ ■■■■■■■■■ ■■
R3  ■■■■■■■■■■ ■■ ■■      ■■ ■                     ■ 
      F1                      F2   F3        F4   F5                    F6
      $1                      $2   $3         $4   $5                    $6

만약 awk 로 위의 데이터를 출력하면

awk '{print $1}' 위의데이터
■■■■
■■
■■■■■■■■■■

이렇게 출력된다.


 

awk [option] 'script' [file]



4. awk 의 옵션

-Fc : field separator 지정 (c 가 구분자이며 기본은 공백으로 설정)
-v 변수=값 : 스크립트를 실행하기 전에 미리 변수에 값을 지정
-f : 스크립트 파일을 지정



5. awk 의 응용

패턴 {동작}
커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표(')로 묶어야 한다.
 - 패턴만 있는 경우 : 패턴과 일치하는 라인을 화면에 출력
 - 동작만 있는 경우 : 모든 라인이 동작의 대상이 됨


 

패턴
- /정규식표현/ : 정규식으로 표현된 패턴과 일치 여부
- 비교연산 : 숫자, 알파벳 모두 사용가능
- 패턴 매칭 연산 : ~ 일치하는 부분 , !~ 일치하지 않는 부분
- BEGIN : 첫번째 레코드가 읽혀지기 전에 어떤 동작을 정의
- END : 마지막 레코드가 모두 읽혀진 후에 어떤 동작을 정의

동작
- 동작은 모두 {}로 둘러싸야 한다.


시스템 변수

 시스템 변수  설명 
 FILENAME  현재 파일명 
 FS  입력 필드 구분
 기본 : 공백
 NF  현재 레코드 필드 갯수
 NR  현재 레코드 번호
 OFMT  숫자에 대한 출력 포맷
 기본 : $.6g
 OFS  출력 필드 구분
 기본 : 빈줄
 ORS  출력 레코드 구분
 기본 : newline
 RS  입력 레코드 구분
 기본 : newline
 $0  입력 레코드
 $n  입력 레코드의 N번째 필드
 ARGC  커맨드 라인의 인자 개수
 ARGV  커맨드 라인 인자를 포함하는 배열
 ENVIRON  환경 변수들을 모아둔 관계형 배열
 FNR  NR과 동일
 단지 현재 파일에 적용된다는 점이 다름
 RSTART  지정한 매칭 연산을 만족하는 문자열의 맨 앞부분
 RLENGTH  지정한 매칭 연산을 만족하는 문자열의 길이


 

연산자

 산술연산자  =, +=, -=, *=, /=, %=
 조건연산자
 (condition)? (true) : (fales)
 논리연산자  ||, &&, !
 패턴연산자  ~, !~
 비교연산자  <, <=, >, >=, !=, ==
 증감연산자  ++, --
 필드참조  $


 

제어문

문법 자체는 C언어의 제어문과 같다.
 - break
 - continue
 - do { Routine } while (condition)
 - exit
 - for ( init ; condition ; re ) { Routine }
 - if ( condition ) { Routine } else { Routine }
 -  while (condition) { Routine }
 - return 


 

함수

 - 문자열 함수
 
 함수명 설명 
 gsub(r, s)
 입력 문자열 전부에 걸쳐 정규식표현 r을 문자열 s로
 치환한다.
 gsub(r, s1, s2)
 입력문자열 s2 에서 정규식 표현 r을 문자열 s1 으로
 치환한다.
 index(s1, s2)
 s1에서 s2의 위치를 넘겨준다. 없다면 0
 length(arg)  인자의 길이를 넘겨준다.
 match(s, r)
 문자열 s에서 정규식표현 r과 매칭 되는 부분의 
 위치를 넘겨준다.
 split(string, array[, seperator])
 구분자를 기준으로(기본:공백)해서 지정한 문자열을 
 배열로 만든다.
 sub(r, s) , sub(r, s1, s2)
 gsub 와 동일
  정규식식표현과 일치하는 문자열이 여러개라도 
 처음 한 문자열만 치환
 substr(s, m)
 문자열 s 에서 m번째 위치에서 끝까지 문자열을 
 넘겨준다.
 substr(s, m, n)
 문자열 s 에서 m번째 부터 n번째까지의 문자열을
 넘겨준다
 tolower(string)  대문자를 소문자로 바꾼다.
 toupper(string)  소문자를 대분자로 바꾼다.


- 수학 함수
 
 함수명 설명 
atan2(x, y)
 archtangent 값
cos(x)
 cos 값
exp(x)
 자연대수 e의 제곱
int(x)
 정수형으로 반환
log(x)
 로그
rand()
 0에서 1까지의 랜덤수
sin(x)
 sin 값
sqrt(x)
 제곱근
srand(expr)
 인자를 가진 난수(없으면 시간을 가지고 난수 발생)


- 입출력 함수
 
 함수명 설명 
close(filename)
 지정한 파일을 닫는다.
close(cmd)
 지정한 명령어 파이프를 닫는다.
delete array[element]
 지정한 배열요소를 지운다.
getline()
 다음 레코드를 읽어 들인다.
getline [variable] [< "filename"]
 파일에서 읽어드린다.
next
 다음 레코드를 입력받는다.
print [args] [> "filename"]
 인자를 출력한다
printf "format" [,exp] [> "filename"]
 형식에 맞춰 인자를 출력한다.
sprintf(format [,exp])
 printf와 마찬가지로 사용되지만 값을 
 리턴하기만 하고 출력은 하지 않는다.
system(cmd)
 시스템 내부 명령어를 실행한다.



6. 예문

1에서 10까지 출력

awk 'BEGIN { for (i = 1;i<=10;i++)  print i }'



현재 디렉토리의 파일들이 이름만 출력

ls -al | awk '{print $9}'



연재 디렉토리의 파일 이름중에 소문자 알파벳이 포함된 파일명은 출력하지 않음

ls -al | awk '/^[a-z]/{ print $9  }'





 

반응형

'리눅스 쉘 스크립트' 카테고리의 다른 글

Find 응용  (0) 2019.08.21
awk 명령어 예제  (0) 2018.01.16
find 사용하기  (0) 2018.01.15
grep 으로 다중 문자열 검색  (1) 2018.01.15
grep 정규 표현식 패턴 예제 두 가지  (0) 2018.01.15
반응형

정규표현식 regex

  • 정규표현식으로 파일을 찾을 때는, 파일 이름뿐 아니라 파일 앞의 디렉토리 명까지 고려해서 정규표현식을 작성해야 한다.
    # 파일 이름이 숫자.txt 인 것들
    find . -regex ".*/[0-9]+.txt"

    특정 시점 이후/이전 수정된 파일

    • -mtime, -atime, -ctime 등을 사용하면 접근/생성/변경 등의 날짜를 기준으로 파일을 찾을 수 있다.
      # 30일 보다 이전에 수정된 파일들
      find . -mtime +30
       
      # 딱 30일 전에 수정된 파일
      find . -mtime 30
       
      # 시간 비교시 해당 일의 시작 시간(00:00) 부터
      find . -mtime 30 -daystart
       
      # 30일 전 이후(오늘 부터 30일 전까지 사이)에 수정된 파일
      fine . -mtime -30

    depth

    • -maxdepth 1 : 최대 디렉토리 한 단계만
    • -mindepth 1 : 명령행 지정된 경로(한 단계)를 제외하고 찾기

    type

    • -type d : 디렉토리
    • -type f : 일반 파일
    • -type l : 심볼릭 링크
    • -type s : socket

    파일 이름만 가져오기

    shell - How to get file only file name with linux `find`? - Stack Overflow

    find ./dir1 -type f -exec basename {} \;
    find /dir1 -type f -printf "%f\n"

    -ignore_readdir_race/-noignore_readdir_race

    • find 명령이 파일 이름을 읽는 순간과 해당 파일의 상태 정보를 읽는 순간의 그 사이에 파일이 삭제될 경우 오류 메시지가 출력 된다. 보통은 No such file or directory
    • -ignore_readdir_race 옵션을 주면 파일이 사라진 상황에 대한 에러 메시지를 안내고 그냥 무시한다.

    동일 이름 파일 목록 얻기

    find . -type f -printf "%f\n" | sort | uniq -c | grep -v ' 1 '

    하위 디렉토리에 존재하는 파일 갯수

    find */ | cut -d/ -f1 | uniq -c

반응형

'리눅스 쉘 스크립트' 카테고리의 다른 글

awk 명령어 예제  (0) 2018.01.16
awk 사용법  (0) 2018.01.16
grep 으로 다중 문자열 검색  (1) 2018.01.15
grep 정규 표현식 패턴 예제 두 가지  (0) 2018.01.15
쉘 스크립트 - AWK 사용법  (0) 2017.12.24
반응형

텍스트 파일에서 2개 이상의 문자열을 검색하는 방법이다.

(A and B) 일단 A라는 문자열과 B라는 문자열이 모두 포함된 행을 찾는 것은 간단하다. 파이프(|)를 이용해서, A가 포함된 뿐을 골라낸 후에 거기서 B를 골라내면 된다.
cat file.txt | grep A | grep B

(A or B) A 또는 B가 포함된 행을 찾으려면 A와 B를 파이프(|) 기호로 연결하면 된다. 연산자로 인식하도록 역슬래시(\)를 붙여준다.
cat file.txt | grep "A\|B"

또는 egrep 명령을 활용해도 된다. 작은따옴표(')와 괄호를 이용한다.
cat file.txt | egrep '(A|B)'

만약 shell script에서 변수에 할당된 문자열을 사용하려고 한다면 egrep으로는 어렵고 앞에 언급한 파이프 기호를 이용해야 한다.
str_a="1st string"
str_b="2nd string"
cat file.txt | grep "$str_a\|$str_b"

 


 

반응형

'리눅스 쉘 스크립트' 카테고리의 다른 글

awk 사용법  (0) 2018.01.16
find 사용하기  (0) 2018.01.15
grep 정규 표현식 패턴 예제 두 가지  (0) 2018.01.15
쉘 스크립트 - AWK 사용법  (0) 2017.12.24
GREP 사용방법 - 옵션, 정규표현식  (0) 2017.12.17
반응형

1. 숫자 4개로 시작하는 줄 뽑아내기

grep ^[0-9][0-9][0-9][0-9] textfile
grep -E "^[0-9]{4}" textfile

  하지만 이 조건만으로는 4자리로 시작하기만 하면 무조건 걸려나옵니다. } 문자 뒤에 공백을 하나 넣어서 처리할 수 있지만 좀 더   좋은 방법은 "단어 단위" 기능(<와 >)을 사용하는 것입니다.

$ grep '\<[0-9]\{4\}\>' textfile
2010
2013 is turning out to be a better year

  다만 이 방법을 사용할 때 주의할 점이 있습니다. 아래를 보시죠.

$ grep '\<[0-9]\{3,5\}\>' textfile
2010
2013 is turning out to be a better year
12345 Taylor Avenue
127.0.0.1

  다른 건 괜찮았는데 마지막에 IP 주소가 걸려 나왔습니다. 숫자 뒤에 문자가 나오는 경우도 "단어의 끝"으로 취급하기 때문입니다. 단어 단위로 걸러낼 때는 이런 사항도 고려해야 합니다.

2. IP 주소 뽑아내기
  IP 주소를 검출하는 게 은근히 생각보다 까다롭습니다. 먼저 특정 IP를 찾는 것부터 시작하겠습니다. 생각없이 그냥 지르면 이런 모습이 나옵니다.

$ grep 12.45.78.0 text
1234567890
12.45.78.0

  정규 표현식에서 점(.)은 하나의 문자를 뜻하니까요. 이럴 땐 -F 옵션(fixed string)을 사용하거나, fgrep 명령어를 사용하거나, 이스케이프 문자를 사용해야 합니다. 처음 두 방법은 사실상 같은 거나 다름없습니다.

$ grep -F 12.45.78.0 text
12.45.78.0
$ fgrep 12.45.78.0 text
12.45.78.0 
$ grep "10\.20\.30\.40" textfile
Don't use the 10.20.30.40 address unless you first talk to Pete.

  이제 IPv4 주소 형식을 띈 문자열을 잡아내는 패턴의 예를 보겠습니다.

$ grep -w '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' textfile
127.0.0.1
Don't use the 10.20.30.40 address unless you first talk to Pete.
Refer to Section 11.2.3.4.20 for the process guidelines.

  마지막에 엉뚱한 게 나왔듯이 위의 방법도 완벽하진 않습니다만 여기서 더 발전시켰다간 필요 이상으로 복잡해지기 때문에 이 정도로 끝내는 게 적절할 것 같습니다.

반응형

+ Recent posts