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 반달가면
bash script2020. 11. 9. 17:11

 

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

 

grep을 이용한 문자열 검색에서 정규표현(regular expression)은 매우 유용하지만 이걸 비활성화해야 될 경우가 있다. 일단, 찾고자 하는 문자열이 명시적으로 정해져 있다면 문제는 간단하다. 문자열을 작은따옴표로 감싸거나, 정규표현에 사용되는 [, -, ] 등의 기호 앞에 역슬래시(\) 기호를 사용하면 된다. 아래의 예시를 보자.

 

# a부터 z까지, 즉 영소문자를 검색하는 정규표현

cat my_file.txt | grep "[a-z]"

 

# 검색하려는 문자열 자체가 '[a-z]'인 경우

cat my_file.txt | grep '[a-z]'

cat my_file.txt | grep "\[a\-z\]"

 

그러나 만약 변수에 할당된 문자열에 정규표현에 사용되는 기호가 포함되어 있을 경우엔 어떻게 할 것인가? 이 경우엔 정규표현으로 해석이 되지 않도록 -F 옵션을 사용하면 된다.

 

str="[a-z]"

cat my_file.txt | grep -F "$str"

 

이렇게 해도 해결이 안되는 경우가 있는데, 검색하고자 하는 문자열이 하이픈(-)으로 시작되는 경우이다. 이 경우에는 -e 옵션을 같이 사용하자.

 

str="-[a-z]"

cat my_file.txt | grep -Fe "$str"

 

파일에서 문자열을 읽어서 변수에 할당하고 이 변수가 grep 명령어에 사용되는 경우, 문자열에 특수문자들이 포함될 가능성이 있다면 -Fe 옵션을 추가해 주자.

 

 

728x90
Posted by 반달가면