bash script2020. 11. 24. 13:56

 

반달가면 이글루에서 백업 - bahndal.egloos.com/451901

 

일단 my_file.txt에서 홀수번째 행만 골라서 출력하는 경우를 생각해 보자. 이 예시를 보면 짝수번째 행을 고른다던가 5, 10, 15... 번째 행만 고르는 경우도 저절로 감이 잡힐 것이다.

 

# my_file.txt의 홀수번째 행만 출력

print=p

max_line=`cat my_file.txt | wc -l`

for line_num in `seq 1 2 $max_line`

do

  sed -n $line_num$print my_file.txt

done

 

우선 my_file.txt에 행이 몇개나 되는지 계산해서 이 값을 변수 max_line에 할당하고, seq 명령을 이용해서 1부터 $max_line까지 홀수를 만든 후 for 반복문에 적용했다.

 

sed 명령을 이용해서 파일의 특정 행을 출력하는 방법은 아래와 같다.

 

sed -n [행번호]p [파일명]

 

# my_file.txt에서 12번째 행을 출력

sed -n 12p my_file.txt

 

여기서는 행번호가 변수 line_num이므로 여기에 p를 같이 쓰면 변수 line_nump로 해석된다. 이를 방지하기 위해 p를 변수 print에 할당하고 $line_num$print 이런 식으로 사용.

 

또한 -n 옵션을 주지 않으면 지정된 행을 출력한 후 파일 내용 전체를 출력하게 되므로 잊지 말고 -n 옵션을 써서 해당되는 행만 출력되도록 하자.

 

짝수행만 고르고 싶다면 for 명령에 적용한 seq 부분을 `seq 2 2 $max_line` 이런 식으로 바꾸면 되겠다. 출력하려는 행을 정하기 위해 이용한 seq 명령에 대한 설명은 이전 게시물을 참조하자. 기본적으로 형식은 아래와 같다. 

 

seq [시작번호] [간격] [끝번호]

참고로 파일의 특정 부분, 예를 들어 3번째 행부터 15번째 행까지를 골라내고 싶다면 아래와 같은 형식으로 사용하면 되겠다. 

 

# 형식: sed -n [시작행],[마지막행]p [파일명]

sed -n 3,15p my_file.txt

 

 

728x90
Posted by 반달가면
bash script2020. 11. 16. 17:29

 

반달가면 이글루에서 백업 - bahndal.egloos.com/451182

 

grep의 문자열 검색 기능을 매우 강력하지만 기본적으로 특정 문자열이 "포함된" 행을 찾아내는 것이다. 특정 문자열에 정확히 일치하는 항목이 있는지를 찾으려면 일이 약간 복잡해 진다.

 

일단 my_file.txt 파일의 내용이 아래와 같다고 생각해 보자.

 

john

john_smith

my name is john smith

my name is john_smith

 

일단 포함 여부가 아니라 행 전체가 일치하는 경우를 찾아야 한다면 -x 옵션으로 간단히 해결할 수 있겠다.

 

cat my_file.txt | grep -x "john"

john

 

또는 정규표현을 이용해도 된다. j로 시작되고(^j) 그 다음에 ohn이 있고 마지막에 n으로 끝나게(n$) 되는 문자열을 찾는 것이다.

 

cat my_file.txt | grep "^john$"

john

 

위 방법은 탭이나 공백이 포함되어 있을 경우에 문제가 될 수 있다. 예를 들어 my_file.txt의 john이라는 행이 john[공백] 이런 식이면 위의 방법으로는 검색이 안된다. 아니면 공백이 있다는 것을 미리 알고 grep의 인자에 반영해야 한다.

 

cat my_file.txt | grep -x "john "

 

탭이 포함된 경우라면 이런 식으로 반영하긴 어렵고 awk를 써야 한다. (탭이 포함된 문자열 검색은 이전 게시물을 참고하자.)

 

그렇다면 행 중간에 있는 특정 문자열을 정확하게 찾으려면 어떻게 할 것인가? 위의 my_file.txt에서 john_smith는 제외하고 john만 찾고 싶은 경우인데, grep의 정규표현과 이전에 게시했던 다중 문자열 검색 방법을 활용해 볼 수 있다.

 

정규표현 중에 [[:graph:]]라는 것이 있다. 화면에 표시할 수 있는 모든 문자(영문 대소문자 + 수자 + 특수기호)를 지칭한다. 공백은 제외된다. 공백도 포함하는 표현은 [[:print:]]이다.

 

자, 이제 아래의 예를 보자.

 

cat my_file.txt | grep "john" | grep -v "[[:graph:]]john\|john[[:graph:]]"

john

my name is john smith

 

우선 john이 포함된 행을 골라낸 후, john 앞에 다른 문자가 붙은 경우([[:graph:]]john) 또는(\|) john 뒤에 다른 문자가 붙은 경우(john[[:graph:]])를 -v 옵션으로 제외시킨 것이다.

 

 

728x90
Posted by 반달가면
bash script2020. 11. 10. 17:48

 

반달가면 이글루에서 백업 - bahndal.egloos.com/445813

 

조금 단순하긴 하지만, 리눅스 셸 스크립트에서도 일반 프로그래밍 언어에서처럼 함수(function)를 만들어서 사용할 수 있다.

일단 형식은 아래와 같다.

function [함수 이름](){
...
return
}

함수를 호출할 때는 그냥 함수 이름을 쓰면 된다. 아래의 예시를 보자. 수자 2개를 인자로 받아서 앞의 수와 뒤의 수를 더한 후 이 값을 제곱하는 계산을 하는 함수를 만들어 보면 대략 아래와 같다. 함수 이름은 arith_test이고 스크립트 안에서 arith_test 3 4 이런 식으로 호출해서 쓰면 된다. bc 명령을 이용한 산수 계산은 이전 게시물을 참고하자.

# 함수 arith_test: f = (x+y)^2
function arith_test(){
  echo "( $1 + $2 )^2 | bc"
  return
}

# main
# 함수 호출. (4+5)^2 계산후 결과를 화면에 출력
arith_test 4 5
# 함수 호출. (3+4)^2 계산후 결과를 result 변수에 할당
result=`arith_test 3 4`

함수에서 계산한 결과를 변수에 할당할 경우, 가장 처음 echo 명령으로 출력된 결과가 변수에 할당된다. 위의 예시에는 echo 명령이 하나뿐이므로 상관 없다. 결과를 변수에 할당하는 방식을 쓰고 싶다면, 함수 안에 echo 명령은 하나만 있는 것이 좋겠다.

스크립트에서 사용하는 변수는 기본적으로 전역변수(global variable)이다. 만약 함수 안에서만 의미가 있는 지역변수(local variable)를 사용하고 싶다면 함수 안에서 변수이름 앞에 local을 붙이면 되겠다. 아래의 예를 보자.

function var_test(){
  local test_var_local="LOCAL"
  test_var_global="GLOBAL"
  return
}

# main
# 함수 호출
var_test
# 변수값 확인. test_var_local 값은 출력되지 않음(지역변수)
echo "$test_var_local"
echo "$test_var_global"

함수 기능은 때에 따라 아주 요긴하게 쓸 수 있다!


 

 

728x90
Posted by 반달가면
샷컷(Shotcut) 기초2020. 11. 9. 17:36

 

샷컷(Shotcut)에서 재생 속도를 느리게 해서 슬로우모션(slow motion) 효과를 주거나 또는 빠르게 해서 패스트모션(fastmotion) 효과를 주는 방법이다. 

타임라인에서 해당 효과를 적용하려는 대상을 마우스 왼쪽 클릭해서 선택한 후에, 마우스 오른쪽 클릭해서 메뉴가 나오게하여 "Properties" 항목을 선택하거나 또는 상단의 "Properties" 버튼을 클릭하자. 그러면 선택한 대상에 대한 속성 메뉴가 왼쪽 상단에 표시된다. 


속성 메뉴에서 "Speed" 항목을 편집해서 재생 속도를 변경할 수 있다. 1.5배속 또는 0.5배속 이런 식으로 값을 바꾼 후에 엔터를 누르면 재생 속도가 적용된다. 


재생 속도 변경으로 소리의 음높이가 바뀌는 것을 보상해 주고 싶다면 "Speed" 항목 옆에 있는 "Pitch Compensation" 항목을 체크해 주면 되겠다. 

 

728x90
Posted by 반달가면