shell01

1984·2022년 2월 2일
0

42Seoul

목록 보기
2/18

2022.02.01 작성

빛나는 % => 개행문자가 삭제되었다는 것을 의미


01 print_groups

환경변수 FT_USER에 포함된 login이 소속되어 있는 그룹의 목록을 표시하는 명령어를 작성하세요. 공백 없이 쉼표로 분리되어야 합니다.

tr = translate characters

사용 방법 :

     tr [-Ccsu] string1 string2
     tr [-Ccu] -d string1
     tr [-Ccu] -s string1
     tr [-Ccu] -ds string1 string2

groups $FT_USER | tr ' ' ',' | tr -d '\n'

or

id -nG $FT_USER | tr ' ' ',' | tr -d '\n'

이름 groups -- 그룹 구성원 표시

개요 group [user]

설명 그룹 유틸리티는 id(1) 유틸리티에 의해 폐기되었으며, "id -Gn [user]"에 해당한다. 정상적인 대화형 사용을 위해 "id -p"라는 명령을 제안한다.
그룹 유틸리티는 사용자(또는 선택적으로 지정된 사용자)가 속한 그룹을 표시한다.

groups 명령어 : 그룹에 속한 사용자 계정 확인

$FT_USER 이라는 환경 변수에 속한 사용자 계정을 확인하는 것이다.

| tr ' ' ',' : 공백을 쉼표로 교체해준다.

| tr -d '\n' : 뒤에 자동으로 붙는 개행문자를 제거해준다.

id : user와 group name 을 표기해주는 명령어

-G : Display the different group IDs (effective, real and supplementary) as white-space separated numbers, in no particular order.

-n : Display the name of the user or group ID for the -G, -g and -u options instead of the number. If any of the ID numbers cannot be mapped into names, the number will be displayed as usual.

-G 옵션만 사용하면 group ID가 숫자로 나온다.
(-G 는 그룹 아이디 모두, -g 는 하나만 나온다.)
-n 옵션도 사용하여 name을 display 해준다.


02 find_sh

현재 디렉토리와 그 하위 디렉토리들에서 파일 이름이 ’.sh’로 끝나는(따옴표 제외) 모든 파일을 찾는 명령어를 작성하세요. .sh를 제외한 파일 이름만을 표시해야 합니다.

#!/bin/bash
find . -name "*.sh" -type f -exec basename {} ".sh" \;

\; 가 아니라, ";"도 괜찮다고 한다!

-exec : 앞의 명령어에서 값을 받아온다. (조건을 가지고 찾은 파일들을 대상으로 다음 명령어를 실행하라!)

-> (find . -name "*.sh" -type f) 의 값을 받아온다.

후,
basename {} : 디렉토리 명을 뺀, 순수한 파일 명을 {}에 담는다.

  • basename, dirname – return filename or directory portion of pathname

사용법

 basename string [suffix]
 basename [-a] [-s suffix] string [...]

그렇기 때문에, basename -s ".sh" {} 를 사용해도 정상적으로 동작이 된다!

".sh" : 접미사로, 출력에서 ".sh"를 제거한다.

\; : ; 표현을 해주기 위해 \를 붙여준다.

unix 에서 ; 표현은 "명령어 세퍼레이터" 표현이다.

기능은, 명령어를 연속적으로 실행해주는 것

예 : clear;ls -> clear 실행 후, ls 실행

그렇기 때문에 ;(세미 콜론)의 특수한 의미를 제거하기 위해 \를 사용한다.


03 count_files

현재 디렉토리 및 그 하위의 모든 디렉토리에 있는 일반 파일 및 디렉토리의 개수를 세어 표시하는 명령어를 작성하세요. 여기에는 시작 디렉토리인 ’.’도 포함되어야 합니다.

find . | wc -l | sed 's/^ *//'

sed - stream editor

사용 방법 :
sed [-Ealn] command [file ...]
sed [-Ealn][-e command] [-f command_file][-i extension] [file ...]

현재 혹은 하위 디렉토리에서 일반 파일 및 디렉토리의 개수를 세어, 라인 개수 출력

find . : 현재 위치에서 하위 디렉토리까지의 모든 파일, 디렉토리를 찾는다.

wc -l : 찾은 파일들이 wc -l 의 input 으로 들어가, 라인 개수를 센다. -> 파일 개수를 센다.

sed 's/^ *//' :

sed s -> 문자열을 치환한다.

/ -> 그냥 기능을 구분해준다.

정규표현식
^ -> 행의 처음
$ -> 행의 끝

* -> 메타 문자, 앞의 문자를 0개 이상 찾는다.
-> 앞이 공백으로 되어있으므로 공백을 찾게 된다.

// 그 다음 바꿀 문자열이 없기 때문에 공백을 없애준다.

즉, sed 's/^ *//' 는 행의 처음부터 공백문자를 찾아 제거

라는 뜻이 되는 것이다.


04 MAC

컴퓨터의 MAC 주소를 표시하는 명령어를 작성하세요. 각 주소 다음에는 줄바꿈이나타나야 합니다.

ifconfig 명령어를 치면 ether 다음에 한 칸 뛰고 xx:xx:xx:xx:xx:xx 형식의 맥 주소가 나오는 것을 확인할 수 있다.

ifconfig | grep "ether " | cut -d ' ' -f2

or grep -w "ether" // 정확한 단어를 찾아서 ethernet---은 출력되지 않는다.

-> ifconfig 명령어를 치면 많은 정보들이 출력된다.

| grep "ether "

-> 그 중에서, "ether " 문자열을 가지고 있는 행을 가져온다.

cut 명령어

cut : cut out selected portions of each line of a file
cut 명령어는 문자 추출, 문자열 자르기 등의 기능을 수행합니다.

사용법
cut -b list [-n][file ...]
cut -c list [file ...]
cut -f list [-d delim][-s] [file ...]
-b : byte 의 위치 명시
-c : 문자의 위치 명시
-f : 필드를 구분자를 이용해 (-d) 구분하고, -fx를 이용해 몇 번째 구분된 필드를 가져 올 것인지 정한다.

| cut -d ' ' -f2

-> 라인의 구분이 뛰어쓰기로 되어있다고 생각하고, cut 명령어를 이용했다. 구분자로 ' ' 뛰어쓰기를 사용했고, ether xx:xx:xx:xx:xx:xx 이렇게 구분되어 있어서 2번째 맥 주소만 출력시키기 위해 -f2를 사용했다.

정상적으로 출력되는 모습이다.


05 Can you create it ?

오직 "42"만 포함하고 그 밖의 어떠한 것도 포함하지 않는 파일을 작성하세요.

특수문자는 각자 기능이 있기 때문에, 순수히 일반문자로만 사용하려면 \를 이용해야 한다.

그래서 파일 이름을 \"\\? .... 으로 해주었다.

그러나, 파일 안의 개행문자 때문에 3바이트가 출력되었다.
파일 안의 개행문자 때문!

파일 안의 개행문자를 제거해주거나

echo 42 | tr -d '\n' > \"\\?....

echo -n 42 > /"///?
-> -n option을 사용하면 개행문자를 제거해준다. 이걸 사용하자!

-> 이렇게 개행 문자를 제거한 채로 파일을 만들어 주어도 괜찮다.


06 Skip

ls -l 명령어의 첫 번째 행부터 시작하여 한 줄 걸러 보여주는 명령어를 작성하세요.

#!/bin/bash
ls -l | awk "NR%2==1"

sed '1d; n; d' :
or
sed -n ‘1~2p’ : 1번째 줄부터 시작해, 2칸 간격으로 출력해라.
or
awk 'NR%2==0' : 0번째 줄부터 시작해,

ls -l 명령어에서 홀수 번째 줄만 출력하면 되는 문제

or

sed를 사용하여 동일한 작업을 수행 할 수 있다.

홀수 라인을 유지

sed 'n; d'

짝수 라인 유지

sed '1d; n; d'

참고!

sed 는 line Number 가 1 부터 시작하고,
awk 도 NR 이 1 부터 시작한다.
awk = 텍스트가 저장되어 있는 파일을 원하는 대로 필터링하거나 추가해주거나 기타 가공을 통해서 나온 결과를 행과 열로 출력해주는 프로그램이다.
다른 명령어들과 다르게 if, for 등의 정규식을 이용해서도 사용할 수 있다는 강력한 장점이 있다.


07 r_dwssap

cat /etc/passwd 명령어의 출력 결과에서 주석은 삭제하고 두 번째 행부터 시작하여 다른 모든 행들은 출력하되, 각 login들 거꾸로 반전시키고 알파벳 역순으로 정렬한 후, FT_LINE1 과 FT_LINE2 을 포함한 그 사이의 값들만 남겨두세요. 이 때, 각login은 ","로 구분되어야 하며 출력 결과는 "."로 끝나야 합니다.(큰따옴표 없이)

문제가 아는 명령어들을 다 조합해서 사용해보라는 의도같다.
6번 문제와 연관되어, 지금까지 썼던 명령어들이 많이 사용되었다.

cat /etc/passwd | sed '/#/d' | cut -d ':' -f1 | awk "NR % 2 == 0" | rev | sort -r | awk "NR >= $FT_LINE1 && NR <= $FT_LINE2" | tr '\n' ',' | sed 's/,/, /g' | sed 's/,$/./' | tr -d '\n'

sed '/#/d' -> 를 이용해 #이 들어있는 행 제거,

cut -d ':' -f1 -> 문장을 이용해 :로 구분된 문자열에서 첫 번째 login을 뽑아낸다.

awk "NR % 2 == 1" -> 문장을 통해 2번째 행부터 시작해 다른 모든 행들을 출력하며 (짝수 행만)

rev -> 로 login들을 거꾸로 반전시킨다.

sort -r -> 로 알파벳 역순으로 정렬한다.

awk "NR >= $FT_LINE1 && NR <= $FT_LINE2" -> 를 통해 FT_LINE1과 FT_LINE2 을 포함한 그 사이의 값들만 남긴다.

tr '\n' ',' -> 를 통해 개행 문자를 , 콤마로.

sed 's/,/, /g' -> 를 통해 모든 곳의 , 콤마를 ', ' 로 바꾸어 주었다.

sed 's/,$/./' -> 마지막에 쉼표는 온점으로 바꾸어주었다.

그리고, 마지막 개행 문자를 삭제해주었다. 마지막은 온점만 있어야 하기 때문이다.

주석 삭제 : http://bahndal.egloos.com/593355

참고 : sed 명령어는 실행할 때, 개행 문자를 전부 빼고 명령을 실행한 후, 끝에 개행 문자를 붙여준다. 그래서 sed를 통해 개행문자를 직접적으로 바꾸어 줄 수 없는 것이다!


08 add_chelou

’\"?! 를 밑으로 하는 숫자를 FT_NBR1 에서 가져오고 mrdoc 를 밑으로 하는 숫자를 FT_NBR2 에서 가져온 후, 두 수의 합을 구해 gtaio luSnemf 이 밑인 숫자로 나타내시오.

#!/bin/bash
echo $FT_NBR1 + $FT_NBR2 | tr "\'" "0" | tr "\" "1" | tr "\"" "2" | tr "\?" "3" | tr "!" "4" | tr "mrdoc" "01234" | xargs echo "obase=13;ibase=5;" | bc | tr "0123456789ABC" "gtaio luSnemf"

echo $FT_NBR1 + $FT_NBR2 = xxxxxxx + xxxxxxx

x 문자를 tr로 치환해준다.

그 후, 5진수 숫자들을 13진수로 바꾸어주고, 계산한다.
xxxxxxxx(13) + xxxxxxxx(13)

그 13진수 숫자들을 또 문자로 치환해주면

obase 와 ibase : (output) (input) 진법을 결정한다.

주의! ibase 먼저 작성 할 경우, obase를 ibase 진법으로 적어주어야 한다.

obase=13; ibase=5; == O
ibase=5; obase=23; == O
ibase=5; obase=13; == X ## 3 + 5 이므로 8진법으로 변환된다.

참고 : 내가 틀렸던 부분.

처음에 나는 5진수끼리 | bc 명령어로 더해주고, 13진법으로 바꾸어도 된다고 생각했다. 하지만, bc는 5진수로 더해주지 않고, 일반 10진법을 이용해 더해주기 때문에 567738 이러한 결과가 나왔고, 이 수를 obase=13;에 넣어주어 계산했기 때문에 계속해서 이상한 문자가 출력되었었다.
-> bc 명령어는 계산해주지만, 그 수가 몇 진수인지는 내가 알려주지 않았으므로 자연스럽게 10진법으로 계산된다 -> 오류!!

profile
42seoul hyojeong / 더하기보다 곱하기로 성장하고 싶습니다.

0개의 댓글