grep -A n pattern datafile
grep -B n pattern datafile

grep -C n pattern datafile

을 사용하면 된다.


n 은 0과 자연수 (1,2,3,4....n)


aa.txt 내용

apple
orange
banana
mango


-A 옵션은 match된 line의 다음 n line을 추가로 출력하여 준다.  (After)

    ex) grep -A 2 orange aa.txt -> orange부터 2라인 아래까지 출력 (orange부터 mango 까지 출력된다.)


-B 옵션은 match 된 line의 전 n line을 추가로 출력하여 준다. (Before)

    ex) grep -B 2 banana aa.txt -> banana부터 2라인 위까지 출력 (banana부터 apple 까지 출력된다.)


-C 옵션은 match 된 line의 이전&다음 n line을 추가로 출력하여 준다. (Before & After)

    ex) grep -C1 banana aa.txt -> banana부터 위아래로 1라인씩 추가로 출력하여 준다.

        (orange부터 mango까지 출력된다.)

    또는 grep -A1 -B1 banana aa.txt 로 하여도 결과는 동일하다.



shc-3.8.9.tgz


 

"shc" 는 스크립트 파일을 바이너리로 바꿔 주는 역할을 합니다.
php encoder 같은 역할을 한다고 보면 됩니다.

예전엔 중요한 소스 같은 경우, php로 스크림트 파일 위치를 열어서 특정 디렉터리에 위치해 놓고 컴파일하여 사용했는데,
"shc"를 사용하니 더욱 강력(?)하고 손 쉽게 인코딩하더군요.

역시 아는 것이 힘입니다.

쉘 스크립트도 역시 중요한 "root" 패스워드 정보, "DB" 정보 등 공유되거나 유출되면 안 되는 파일들이 존재합니다.

이럴 때 정말 유용하게 사용될 수 있으니, 아직까지 모르셨던 분들 아래 문서 참고하셔서 도움되시길 바랍니다.

좋은 날, 기쁜 날 되시길 빕니다.


-------------------------------------------------------
1. 다운로드  
-------------------------------------------------------
(1) 공식
    http://www.datsi.fi.upm.es/~frosal/ 

(2) rootman 사이트
    http://www.rootman.co.kr/NFS/Util/shc-3.8.3.tgz 


-------------------------------------------------------
2. 설치
-------------------------------------------------------
 [root@ns1 local]# tar xvfz shc-3.8.3.tgz
 shc-3.8.3/CHANGES
 shc-3.8.3/Copying
 shc-3.8.3/Makefile
 shc-3.8.3/match
 shc-3.8.3/pru.sh
 shc-3.8.3/shc.1
 shc-3.8.3/shc.c
 shc-3.8.3/shc.html
 shc-3.8.3/shc.README
 shc-3.8.3/test.bash
 shc-3.8.3/test.csh
 
 [root@ns1 shc-3.8.3]# make install
 ***     Installing shc and shc.1 on /usr/local
 ***     ¿Do you want to continue? y
 install -c -s shc /usr/local/bin/
 install -c -m 644 shc.1 /usr/local/man/man1/


"shc" 파일은 /usr/local/bin/ 디렉터리에 설치됩니다.


-------------------------------------------------------
3. 테스트
-------------------------------------------------------
(1) 파일 생성 (__EOF___ 까지 쉘 상태에서 긁어다가 붙이시면 됩니다.)
cat > /root/tmp/script.sh    << __EOF__
#!/bin/sh
#------------------------------
# this file is not encrypted
#------------------------------
echo "I love Duane's articles and will send him a donation via PayPal."
exit 0;
__EOF__


(2) 명령행 실행
  [root@ns1 tmp]# shc -f /root/tmp/script.sh
  "script.sh.x"라는 바이너리 파일이 생성된다.


(3) 생성된 스크립트 수행
  [root@ns1 tmp]# ./script.sh.x
  I love Duane's articles and will send him a donation via PayPal.


-------------------------------------------------------
4. 특이한 기능
-------------------------------------------------------
[root@ns1 tmp]# shc -e 09/10/2004 -m "Dude it is too late to run this script." -f script.sh
[root@ns1 tmp]# ./script.sh.x
./script.sh.x: has expired!
Dude it is too late to run this script.

- 쉘 스크립트에 대한 만료일을 지정하여 실행할 수 있습니다.
- 지정된 날짜 이후는 실행되지 아니합니다.
- 위 예는 "2004년 10월 9일"을 스크립트 만료일로 지정하여 만료 후에는 "Dude it is too late to run this script."라는
 메시지를 출력하라고 지정한 내용입니다.


-------------------------------------------------------
5. 참고사항
-------------------------------------------------------
- "shc" 명령어는 스크립트에 대한 C 소스 코드를 생성합니다.
- binary로 파일이 생성되므로 "./파일명" 형태로 실행하여야 합니다.
- 생성된 스크립트 파일은 이름을 변경해도 무관합니다.


-------------------------------------------------------
6. 기본 실행 옵션 설명
-------------------------------------------------------
(1) -e date
    만료일을 지정합니다. (dd/mm/yyyy format)

(2) -m message
    만기 시 메시지를 출력합니다.

(3) -f script_name
    컴파일할 스크립트 파일을 지정합니다. (자신의 시스템에서만 실행됨)

 

(4) shc -v -r -T -f myscript

    -T (trace)옵션을 주어야 다른 시스템에서도 실행이 된다.

 

출처 : http://www.mapoo.kr

<?
        //디데이 구하는 계산식 추가 - 20151127 gdkwon
        $days1 = intval((strtotime(date("Y-m-d",time())) - strtotime("2016-05-28")) / 86400);

        if($days1>0){
                $dmark = "+";
                $days2 = $days1;
        }else{
                $dmark = substr($days1,0,1);    //$days1의 부호
                $days2 = substr($days1,1);
        }

        $dslen = strlen($days2);                        //$days2의 길이


        if($days1==0){
                $dday = "D-day";
        }else if($dslen == 1){                          //$dslen이 한자리면 앞에 0을 붙임
                $dday = "D".$dmark."0".$days2;
        }else{
                $dday = "D".$dmark.$days2;
        }
?>

<head>
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" />
</head>
<p><h2><?=$dday?></h2></p>

[설명] strtotime("2016-05-28")) 항목에 d-day 의 날짜를 입력해준다.

[쉘 프로그래밍을 위한 sed 활용 예제 정리]

1. 특정 패턴 아래 라인 삭제 또는 추가

sed -i '/apple.*/{n;d}' abc.txt  // apple패턴아래 1줄 삭제

[결과] cat abc.txt
apple
banana

sed -i 's,\(apple.*\),\1\ngrape,g' abc.txt  // apple패턴아래 grape 추가

[결과] cat abc.txt
apple
grape
ornage
banana

[원본]abc.txt 의 내용

apple
orange
banana


2. 개행문자 (newline) 이 2개 연속으로 있을 때를 이를 1개로 변경하는 명령

sed -i '/^$/N;/^\n$/D' filename

filename 의 내용중 newline 이 2개 연속으로 있을때 이를 1개로 치환하며  -i 옵션은 변경된 내용을 출력하지 않고 filename 에 저장


3. sed 명령어에 변수사용

sed "s/abc/$dma/g" 와 같이 큰따옴표(") 안에 변수를 사용하면 된다.
sed 's/abc/$dma/g' 명령어는 abc 문자를 $dma 라는 문자로 바꾸라는 뜻이다.

즉, 작은따음표의 경우에는 $dma를 변수 dma로 인식하지 않고 문자열 $dma로 인식한다. 

 

4. 특정패턴 위/아래 에 내용 추가

sed "/찾을패턴/i추가할패턴" 파일명  (상단에 추가)
sed "/찾을패턴/a추가할패턴" 파일명 (하단에 추가)

 

5. 특정 라인 맨 앞/뒤 내용 추가

 

sed "행번호s/^/문자열/" 파일명 (라인 맨 앞 추가)
sed "행번호s/$/문자열/" 파일명 (라인 맨 뒤 추가)

 

6. 변수 값에 슬래쉬 (/) 가 포함된 값을 치환 할 때

[예제]
var="/home/user1/public_html" 변수 값 앞에 주석 (#) 을 붙인다고 하면
sed -i "s~$var~#$var~g" "파일명"

 

7. 문자열 앞/뒤 공백 제거

's/^ *//g' : 앞 공백 제거
's/ *$//g' : 뒤 공백 제거

[응용] 문자열 맨 앞/뒤 공백 한번에 제거

sed -e 's/^ *//g' -e 's/ *$//g' > test.txt