'변수'에 해당되는 글 2건

  1. 2012.08.28 GNU Awk 사용자 가이드/변수
  2. 2012.07.26 Windows 환경 변수 확인 및 설정 - SET
2012.08.28 10:05

GNU Awk 사용자 가이드/변수

Variable의 개념

변수란 data를 비롯하여 프로그램이 처리하는 값의 이름을 가리키는 말입니다. 예를 들어 아래와 같은 자료가 있다고 합시다.

몸무게시력
180681.2
175600.4
168552.0

이 때 키, 몸무게, 시력과 같이 data를 분류하고 설명하는 이름들을 변수라고 할 수 있습니다. 만약 각각의 항목에 대하여 평균을 구한다고 하면 '평균'이란 요소 역시 변수의 하나가 됩니다.

awk에서는 변수를 크게 두 종류로 나눌 수 있습니다. 하나는 사용자가 임의로 자유롭게 만들 수 있는 사용자 정의 변수입니다. 프로그램의 목적에 따라서 사용자가 마음에 들어하는 이름으로 변수를 만들 수 있습니다. 다른 하나는 내장변수(Built-In Variable)란 것으로, awk에서 이미 만들어놓은 변수들입니다. 이 변수들은 각각 특정한 성질과 의미들을 갖고 있습니다. 내장변수들에 사용된 이름들은 사용자가 임의로 바꿀 수 없고 같은 이름으로 사용자 변수를 만드는 것도 불가능합니다.

Built-In Variable

대부분의 awk 변수들은 사용자의 목적에 따라 이용이 가능합니다. 사용자의 프로그램이 그것들에 값을 바꾸기 전까지 변수들은 바뀌지 않으며 프로그램이 변수들을 사용하지 않는 한 그것들은 어떠한 영향도 미치지 않습니다. 하지만 awk의 일부 변수들은 특별하면서 내장된 의미를 갖고 있습니다. 내장변수는 크게 두 부류로 나눌 수 있는데 하나는 awk가 자동적으로 사용함으로써 사용자가 awk에게 어떤 일들을 하라고 명령이 가능하게 하는 변수들입니다. 나머지는 awk에 의해 자동적으로 설정됨으로써 awk의 내부 작업으로부터의 정보들을 사용자의 프로그램에 옮겨주는 기능을 합니다.

이 문서에서는 gawk의 주요 내장변수들을 사용목적에 따라 구분하고 설명하고자 합니다.

프로그램을 통제하는 내장변수

아래의 것들은 사용자가 값을 바꿈으로써 awk 프로그램의 특정 데이터 처리방식을 조정할 수 있는 내장변수들입니다. gawk에만 해당하는 변수들은 # 표시하였습니다.

변수명설명
CONVFMT이 변수는 숫자를 문자열로 바꿔줍니다. 기본값은 "%.6g"
FIELDWIDTHS #input을 field의 길이로 나눌 때 사용. FS보다 우선순위가 앞선다
FSInput에 대한 필드 구분자. Field Seperator의 약자. 사용자는 FS =" "에서 " "안에 기호를 넣음으로써 필드 구분자를 정의할 수 있다
OFMT #이 변수는 숫자를 문자열로 바꿔줍니다. CONVFMT이전에 사용되던 변수
OFS #output에 대한 필드 구분자. 사용법은 FS와 동일
ORS #output에 대한 레코드 구분자.
RS #Input에 대한 레코드 구분자
SUBSEPsubscript의 seperator
TEXTDOMAIN #awk 수준에서 프로그램을 국제화하기 위해 사용되는 변수. 이 변수는 기본적인 소스 텍스트에 표시된 문자로 텍스트 도메인을 설정합니다

정보를 전달하는 내장변수

다음의 변수들은 사용자의 프로그램에 필요한 정보를 제공하기 위해 특정 성질의 값을 awk에서 자동적으로 설정한 것들입니다.

변수명설명
ARGV배열 안에 포함된 명령행 인자
ARGC존재하는 명령행 인자의 개수 표시
ARGIND현재 파일에서 처리되고 있는 ARGV에 대한 index
ENVIRON다양한 환경값들을 연관있는 배열로 표시
EPRNOgetline으로 redirection하는 동안 에러가 발생했을 때 에러를 표시함
FILENAME현재 작업중인 파일의 이름 표시
FNR입력되는 파일이 여러 개인 경우 현재 처리중인 파일의 NF 표시
NF데이터의 필드 수를 표시 Number of Field
NR데이터의 레코드 수를 표시 Number of Record
PROCINFO#실행되고 있는 awk 프로그램에 대한 정보를 제공
RLENGTHmatch 함수에 의해 매치된 하부문자열의 길이 표시
RSTARTmatch 함수에 의해 매치된 하부문자열의 시작지점 표시
RT#RS에 의해 구별된 레코드 Input 텍스트를 표시

ARGV, ARGC 사용하기

ARGV는 awk 프로그램에서 자주 쓰이는 내장변수입니다. ARGV는 사용자가 명령행에 입력한 인자를 인풋으로 받아 프로그램 내에서 처리할 수 있도록 도와주기 때문에 매우 유용합니다.

ARGV의 사용법을 익히기 위해 잠시 예를 살펴보겠습니다.

BEGIN {
        print ARGV[1];
}

위와 같은 프로그램을 print.awk라고 저장하고 실행시키면 아래와 같은 결과가 나옵니다

$ gawk -f print.awk

이처럼 아무런 값이 출력되지 않는 이유는 내장변수 ARGV[1]에 해당하는 입력값을 넣지 않았기 때문입니다. 다음과 같이 해보겠습니다

$ gawk -f print.awk Hello
Hello

Hello라는 글자가 출력되었습니다. 이 경우에는 내장변수 ARGV[1]에 입력값 Hello를 넣어줬기 때문입니다. 이상에서 우리는 ARGV[1]가 명령행에서 명령어 다음 칸의 입력값을 가리키고 있음을 알 수 있습니다. 마찬가지로 ARGV[2]는 명령어로부터 다음다음칸의 입력값을 가리킬 것이라 생각할 수 있습니다. ARGV[1]과 ARGV[2]를 사용하는 프로그램을 만들어 보겠습니다.

BEGIN {
        print ARGV[1], ARGV[2];
}

이 프로그램을 print2.awk라 저장하고 아래와 같이 실행시키면

$ gawk -f print2.awk Hello World
Hello World

가 나타납니다. 내장 변수 ARGV[i]는 이처럼 명령어를 기준으로 i번째에 해당하는 명령행 인자를 가리킵니다.

ARGC는 명령행 인자의 총 개수를 표시합니다. 이 변수를 ARGV와 같이 활용하면 조건문을 이용하여 루프 프로그램을 만드는 것이 가능합니다. 예제를 살펴보겠습니다.

 BEGIN {
        for (i = 0; i<ARGC; i++) {
                print ARGV[i]
        }
}

위와 같이 입력한 프로그램을 ARGC.awk 라 저장하고 다음과 같이 실행해봅시다.

 $ gawk -f ARGC.awk Hello My World
> Hello
  My
  Wolrd

ARGC를 이용한 루프 프로그램의 장점은 명령행 인자를 몇 개 입력했는지와 상관없이 일반화된 루프 처리가 가능하다는 것입니다.


출처 : ko.wikibooks.org


Trackback 0 Comment 0
2012.07.26 17:06

Windows 환경 변수 확인 및 설정 - SET

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS>HELP SET
cmd.exe 환경 변수를 보여주거나 설정하거나 지웁니다.

SET [변수=[문자열]]

 변수      환경 변수 이름을 지정합니다.
 문자열    변수에 할당할 문자열을 지정합니다.

매개 변수 없이 'SET'이라고 입력하면, 현재 환경 변수를 볼 수 있습니다.

명령 확장을 사용하면 SET는 아래와 같이 바뀝니다.

SET 명령은 변수 이름만으로 호출되며, = 기호나 값으로
그 변수의 값을 표시하지는 않습니다. 예를 들어,

   SET P

는 문자 'P'로 시작되는 모든 변수를 표시합니다.

SET 명령은 변수 이름을 현재 환경에서 찾을 수 없으?
ERRORLEVEL을 1로 설정합니다.

SET 명령에서는 환경 변수 이름에 = 기호를 사용할 수 없습니다.

SET 명령에는 아래와 같이 새로운 두 개의 스위치가 추가됩니다.

   SET /A 표현식
   SET /P 변수=[promptString]

/A 스위치는 = 기호의 오른쪽에 있는 문자열이
수식임을 지정합니다. 이는 계산되어 문자열로 변환되거나
지정한 변수의 새 값으로 만들어진 결과입니다.
표현식 평가기는 매우 간단하며 아래 연산을 지원합니다.

   ()          - 그룹 짓기
   ! ~ -               - 단일 연산자
   * / %               -  산술 연산자
   + -                 - 산술 연산자
   << >>               - 논리 이동
   &                   - 비트단위 and
   ^                   - 비트단위 상호 배제 or
   |                   - 비트단위 or
   = *= /= %= += -=    - 할당
     &= ^= |= <<= >>=
   ,                   - 식 구분 기호

논리 연산자를 사용하면 표현식 문자열을 인용 부호로 묶어야
합니다.  표현식에서 숫자가 아닌 문자열은 환경 변수 문자열로
취급하며, 그 값은 사용하기 전에 숫자로 변환됩니다. 환경 변수 이름이
지정퓸鄕嗤?현재 환경에서 정의되지 않았으면 0 값이 사용됩니다.
이렇게 하면 환경 변수 값을 가져오기 위해 % 기호를
모두 입력할 필요 없이 환경 변수 값으로 산술 연산을 수행할 수
있습니다. 명령 스크립트 밖의 명령 줄에서 SET /A를 실행하면,
표현식의 마지막 값이 표시됩니다. 할당 연산자의 왼쪽에
환경 변수 이름이 있어야 합니다.  숫자 값은 아무 접두어가 없으면
십진수이며, 접두어 0x는 16진수, 0은 8진수를
나타냅니다. 그러므로 0x12, 18는  022와 같습니다.
8진수는 혼동될 수 있다는 것에 주의하십시오: 08과 09는 
8, 9가 올바른 8진수가 아니므로 잘못된 수 입니다.

/P 스위치는 변수의 값을 사용자가 입력한 입력 줄에 설정하도록 
허용합니다. 입력 줄을 읽기 전에 지정한 promptString을 표시합니다. 
PromptString을 비어둘 수 있습니다.

환경 변수 대체를 다음과 같이 확장했습니다:

   %PATH:str1=str2%

은(는) "str2" 문자열을 가진 확장된 결과에 나타나는 각 "str1" 문자열을 
대체하는 PATH 환경 변수를 확장합니다. 확장된 출력에 나타나는 모든 
"str1" 문자열을 효과적으로 삭제하기 위해 "str2" 문자열을 비어둘 수
있습니다. "str1" 문자열이 별표(*)로 시작할 수 있습니다. 이 경우에는 
확장된 출력의 시작 부분에서부터 str1의 나머지 부분의 첫 문자열까지의 
모든 문자열을 일치시킵니다.

또한 확장용 하위 문자열을 지정할 수 있습니다.

   %PATH:~10,5%

은(는) PATH 환경 변수를 확장한 다음 확장된 결과의 11(10 오프세트)번째 
문자에서 시작한 5 문자만 사용합니다. 길이를 지정하지 않으면 기본값을 
변수 값의 나머지로 지정합니다. 두(오프세트 또는 길이) 수 모두 음수이면, 
사용한 수는 오프세트 또는 지정한 길이에 추가된 환경 변수 값의 
길이입니?

   %PATH:~-10%

은(는) PATH 변수의 마지막 10 문자를 추출합니다.

   %PATH:~0,-2%

은(는) PATH 변수의 2 문자만 제외한 모든 문자를 추출합니다.

지연된 환경 변수 확장명에 대한 지원이 추가되었습니다.  이 지원은 항상
기본적으로 사용할 수 없지만 /V 명령줄을 CMD.EXD로 전환하여 사용할 수 있거나
사용할 수 없게 될 수 있습니다.  CMD /?를 참조하십시오.

지연된 환경 변수 확장명은 텍스트의 줄을 실행할 때가 아니라 
읽을 때 발생한 현재 확장명의 한계를
극복하는데 유용합니다.  다음 예제는
직접 변수 확躍諮?나타나는 문제를 보여줍니다:

   set VAR=before
   if "%VAR%" == "before" (
       set VAR=after
       if "%VAR%" == "after" @echo If you see this, it worked
   )

양쪽 IF 설명에 있는 %VAR%가
첫 번째 IF 설명을 읽을 때 대체되고
논리적으로 복합문인 IF의 본문을 포함하기 때문에 메시지를
표시하지 않습니다. 그래서 복합문에 있는 IF가 결코 같을 수 없는
"before"과 "after"를 비교하고 있습니다.  유사하게, 다음 예제는
예상한 것처럼 작업하지 않습니다:

   set LIST=
   for %i in (*) do set LIST=%LIST% %i
   echo %LIST%

현재 디렉터리에 파일 목록을 만들지 않지만,
대신 LIST 변수를 최근에 찾은 파일에 설정합니다.
다신 한번, 이것은 %LIST% 변수가 FOR 설명을 읽을 때
한번 확장되었고 그때 LIST 변수가 비었기 때문입니다.
실행하고 있는 실제 FOR loop는:

   for %i in (*) do set LIST= %i

이것은 LIST를 최근에 찾은 파일에 설정합니다.

지연된 환경 변수 확장명은 실행 시간에 환경 변수를
확장하도록 다른 문자(느낌표)를 사용하도록
허용합니다.  지연된 변수 확장명을 사용할 수 있으면,
위의 예제가 의도된 대로 다음과 같이 작업하도록 쓰여질 수 있습니다:

   set VAR=before
   if "%VAR%" == "before" (
       set VAR=after
       if "!VAR!" == "after" @echo 이렇게 되면
   )

   set LIST=
   for %i in (*) do set LIST=!LIST! %i
   echo %LIST%

명령 확장을 사용하면 확장될 수 있으나 SET에 의해
표시되는 변수 목록에 나타나지 않는 몇몇의
동적 환경 변수가 있습니다. 이 변수 값은
변수 값이 확장될 때마다 동적으로 계산됩니다.
사용자가 변수를 이 이름 중 하나로 분명하게 정의하면
이 정의가 아래에 설명된 동적 변수를 무시합니다:

%CD% - 현재 디렉터리 문자열로 확장합니다.

%DATE% - DATE 명령과 같은 포맷을 사용하여 현재 날짜로 확장합니다.

%TIME% - TIME 명령과 같은 포맷을 사용하여 현재 시간으로 확장합니다.

%RANDOM% - 0과 32767 사이에 있는 임의 숫자로 확장합니다.

%ERRORLEVEL% - 현재 ERRPRLEVEL 값으로 확장합니다

%CMDEXTVERSION% - 현재 명령 프로세서 확장자 버전 번호로
   확장합니다.

%CMDCMDLINE% - 명령 프로세서를 호출하는 원본 명령줄로
   확장합니다.



C:\WINDOWS>HELP SETLOCAL
일괄 컥臼【?환경 변경의 지역화를 시작합니다. SETLOCAL이 시작된 후 일어난 환경 변경은 일괄 파일에만 
유효합니다.
이전 설정으로 복구하려면 ENDLOCAL을 사용해야 합니다.  배치 스크립트 끝에
도달하면, 암시적인 ENDLOCAL이 배치 스크립트가
만든  모든 특별한 SETLOCAL 명령어를 실행합니다.

SETLOCAL

명령 확장을 사용하면 SETLOCAL는 아래와 같이 바뀝니다.

SETLOCAL 일괄 명령은 선택적인 인수를 받아들이게 되는데,
인수는 ENABLEEXTENSIONS나 DISABLEEXTENSIONS가 될 수 있습니다.
이렇게 하면 SETLOCAL 명령에 앞서 설정한 것?관계 없이 대응되는
ENDLOCAL 명령이 나타날 때까지 명령 처리 확장을 사용하거나 사용하지 않습니다.

SETLOCAL 명령은  인수가 주어지면 ERRORLEVEL값을 설정합니다.
두개의 올바른 인수 중 하나가 주어지고 다른 하나가 주어지지 않으면 0이
됩니다. 이것으로 아래와 같은 기법을 사용하여 일괄 스크립트에서 확장을
사용 가능한지를 결정할 수 있습니다.

VERIFY OTHER 2>nul
   SETLOCAL ENABLEEXTENSIONS
   IF ERRORLEVEL 1 echo 확장을 사용할 수 없습니다.

이것은 CMD.EXE, SETLOCAL의 이전 버전에ERRORLEVEL 값이
설정되?않았기 때문에 작동합니다. 잘못된 인수와 함께 VERIFY 명령을
사용하면 ERRORLEVEL 값이 0이 아닌 값으로 초기화됩니다.



C:\WINDOWS>HELP SHIFT
일괄 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.

SHIFT [/n]

명령 확장을 사용하면, SHIFT 명령은 n(n은 0에서 8사이의 수)째
인수에서 이동을 시작하는 /n 스위치를 지원합니다. 예를 들어:

 SHIFT /2

는 %3을 %2로, %4를 %3으로, %1을 %0으로 이동합니다.


출처 : http://www.colorconsole.de/


Trackback 0 Comment 0