컴퓨터/linux2009. 4. 23. 20:26
종종 통계물리 연구를 하다보면 종종 여러 파일에 대해서 명령어를 연속적으로 입력해 야 할때가 있습니다. 예를 들어서 

./test1.o > object1.txt
./test2.o > object2.txt
./test3.o > object3.txt
./test4.o > object4.txt

이런 식으로 연속적으로 실행해야 하는경우 이죠.. 가장 좋은 방법은 bash  shell을 만드는 방법이 편하죠. 이것은 shell script라고도 합니다. 

vi example.sh 

으로 파일을 만든후에 안에 명령어를 차곡차곡 입력하면 됌니다. 파일을 실행하면 입력된 명령어들이 맨위부터 차례로 실행되게 되는데요 . 우선은 맨앞에서 쉘의 형식을 써주어야 하는데요. 대부분 bash쉘이니까

#!/bin/bash 

이런 식으로 써주면 됌니다. 그 다음부터 차근차근 써나가면 돼요. 다 쓰고 나서 실행을 할때는 실행 퍼미션을 설정해주고 실행을 하면 됌니다.

chmod +x example.sh 혹은 chmod 755 example.sh 

이런 식으로 입력해주면 실행권한을 가지게 되지요. 그리고나서 실행 하면 됌니다

./example.sh 

그럼 신나게 실행이 됨니다. 이 방법 외에도 오늘 전까지 제가 쓰던 방법은 명령어를 세미콜론 ; 으로 구분한 다음에 쉘에 그냥 갔다가 붙이는 방법입니다. 복사해서 붙여넣기를 하는거죠. 예를 들어 위에 있는걸 실행한다면

./test1.o > object1.txt; ./test2.o > object2.txt; ./test3.o > object3.txt; ./test4.o > object4.txt

이런 식으로 하고 넣어주기만 하면 맨앞 세미콜론부터 실행 시키기 시작합니다. 조금 무식한 방법 같아 보이긴 하지만 굉장히 편리한 방법입니다. 그렇다면 간단하게 10개 내외의 명령어의 경우에는 그냥 손으로 쓰면 되는데 저처럼 한 100개 정도이면 어떻게 할까요??
이 경우에도 간단하게 awk를 이용해서 해결하는 방법이 있습니다.

ls *.o > test.txt
awk '{print "./"$1, " > object"$0".txt"}' test.txt > example.sh

이런 식으로 처리해주는 방법인데요. 딱 봐도 약간 난해해 보이지만 실제로는 그다지 어렵지 않습니다. 이건 같단하게 명령어들을 쉘에 써주는게 되는데요. "" 안에는 문장이 들어가게 됨니다. 즉 "" 에는 반복적으로 들어가는 명령어 부분을 넣으면 되구요. 그외에 부분엔 $0.$1을 넣어서 test.txt의 열을 출력하게 됨니다. $1은 첫번째열 $2는 두번째열 이런식이죠. $0인경우에는 줄번호를 출력하게 됨니다. 
실제로 awk는 데이터 베이스를 위한 명령어로 파일을 정리하고 편집하는데 굉장히 편리한 명렁어 입니다. 개인적으로 작년쯤 프로그램으로 삽질을 하고 있었을때 연구실 누나가 가르쳐준 방법이죠.. 빨리 알았다면 그 고생 안햇을덴데..;; 

awk문법은 대충 
awk "{명령어 출령형식}" 읽어들일파일 

이런식인데요 이렇게 하고 치면 우선 화면에 출력이 됨니다. 이것을 리다이얼(>)로 bash파일에 쑤셔 넣으면 됨니다. 리다이얼을 아직 모르시는 분이 많으시려나? 라다이얼은 결과물을 꺽쇠방향으로 보내주는것인데요. 화면에 출력되는 것을 그대로 저장해줍니다. 두개를 써서 error를 저장해주기도 하는데요. 이는 나중에 다시 포스팅 하겠습니다.

이렇게 script를 만들거나 해서 실행하면 작업의 양이 많은 경우에는 시간이 상당히 걸리는데요. 이럴때는 bg로 만들거나 screen을 이용해서 세션 관리를 해두면 됨니다. 이는 나중에 언급하도록 하죠. 그런데 그정도로 오랜시간이 걸리는 계산을 하시는 분들이라면 이런것쯤은 알고 있지 않을까 싶네요..;;
Posted by blindfish