ex01 print_groups
1. groups $FT_USER | sed 's/ /,/g'
2. id -Gn
★틀린 이유★
★ tr -d '\n' : 개행 지우기 ★
1. sed 사용법
sed (stream editor) : 그래픽 인터페이스가 없는 명령행 유틸리티임 그래서 많은 편집 작업을 일괄적! 으로 처리하기에 아주! 적합한 도구이다.
sed는 파일을 한행씩 처리하고 현재 작업중인 라인을 패턴스페이스란 곳에 저장함
# 사용 문법sed 'command' [filename]sed s/regular_expression/replacement_String/flags input_fileex) sed s/file_nmae/file_name/ > filename.txt |
# sed 명령어들d : 행 삭제h : 패턴스페이스 내용을 홀드스페이스로 복사H : 패턴스페이스 내용을 홀드스파이스로 추가g : 홀드스페이스 내용을 패턴스페이스에 복사G : 홀드스페이스 내용을 패턴스페이스에 추가p : 행을 출력함n : 다음입력q : sed 종료r : 파일로 부터 행을 읽어 온다! : 선택된 행을 제외한 나머지 전체 행에 명령어를 적용s : 문자열을 치환함 |
** s - 검색 & 치환
s는 검색과 치환을 수행한다는 뜻이다. 슬래시(/)로 검색하고 치환할 정규 표현식을 지정한다.
ex) sed s/filename/filename.txt/ filename.txt
filename.txt에 있는 filename이란 스트링을 filename.txt로 치환한다.
** \ -역슬래시
역슬래시(\)는 이스케이프 문자라고 부르는데 \다음에 오는 문자는 정규표현식으로 해석하지 않는다. 결국 스트링에 특수기호가 포함되어 있을때 \를 사용한다.
ex) sed s/\$FL/\$FILELIST/ filename.txt
** 한행에 여러번 나오는 문자열 교체하기 (flag : g)
sed는 행단위 편집기로, 행을 한번에 하나씩 메모리로 읽은 후 한단위로 처리한다.
sed를 실행할 때는 이 사실을 명심해야한다. 모든 명령행 옵션도 이러한 설계 철학에 기반을 두기 때문이다.
기본적으로 행마다 sed 명령을 새롭게 적용한다고 이해하면 되겠다
그래서 한줄에 같은 단어가 2개 이상 있다면 하나만 바뀌고 끝난다.
filename : prj.txt
project : aaa.prj, project : aaa
project : ok
위에 내용에서 project를 project_name로 바꾸고 싶다면
sed s/project/project_name/ prj.txt
그러나!! 두번째 둘의 콤마(,)뒤의 project는 바뀌지 않은것을 볼수 있을 것이다.
그래서 다음과 같이 g flag(global)를 이용한다.
sed s/project/project_name/g prj.txt
** 선행검색
s앞에 /string/을 사용하면 선행검색이 가능하다
ex) sed /okplayers/s/players :/artist :/ playerlists.txt
okplayers가 있는 줄을 찾아 players :를 artist :로 바꾸어라
** 콜론(:)으로 끝나는 문자열 모두 변경하기
정규표현식을 이용한 sed 활용법을 정리해 보자
filename:$FLN
system "echo project:$project"
system "echo version:$version"
위의 문자에서 :으로 끝나는 문자열을 모두 변경하여 보자!!!
sed s/[a-z]*:/value:/g system.txt
변경된 내용은 다음과 같다
value:$FLN
system "echo value:$project"
system "echo value:$version"
그러나!! 이것보다 더 좋은 것이 있었으니,
일정 형식의 string에 앞에 어떤 단어를 추가 하고 싶을 때
기존의 filename:, project:, version: 앞에 new_를 추가 하고 싶으면 앰퍼센트를(&) 사용하면된다.
** 앰퍼센트(&)
위의 내용에서 각각의 콜론 앞 스트링에 new_를 붙이고 싶다면!!filename:$FLNsystem "echo project:$project"system "echo version:$version"sed s/[a-z]*:/new_\&/g system.txtnew_filename:$FLNsystem "echo new_project:$project"system "echo new_version:$version" 이렇게 됨 ㅎㅎ |
https://m.blog.naver.com/PostView.nhn?blogId=hanajava&logNo=220595096628&proxyReferer=https:%2F%2Fwww.google.com%2F
2. group
groups 그룹명 -> 그룹에 속한 사용자 계정을 확인할때 사용하는 명령어
ex02 find_sh
현재 디렉토리와 그 하위 디렉토리들에서 파일 이름이 ’.sh’로 끝나는(따옴표 제외) 모 든 파일을 찾는 명령어를 작성하세요. .sh를 제외한 파일 이름만을 표시해야 합니다.
find ./ -type f -exec basename {} \; | grep .sh$ | sed 's/.sh$//g'
- find [path] 정규식표현
- -type 지정한 파일 유형을 찾는다. d:디렉토리 f:일반 파일 l:링크파일 b:블록디바이스 c:캐릭터디바이스
- -exec 찾아진 파일 등과 연계하여 어떠한 명령을 내릴수 있는 옵션. 결과값 {}기호로 표시하고 \;로 끝내야 함.
- basename {}\;디렉토리이름을 제외한 파일이름만 가져온다.
- grep 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자할 때 사용하는 명령어입니다. 리눅스에서 가장 많이 사용되는 명령어 중 하나이죠.
#명령어 grep 참고 https://recipes4dev.tistory.com/157
ex03 count_files
현재 디렉토리 및 그 하위의 모든 디렉토리에 있는 일반 파일 및 디렉토리의 개수 를 세어 표시하는 명령어를 작성하세요. 여기에는 시작 디렉토리인 ’.’도 포함되어야 합니다.
sed -e 's/^ *//g'
find . | wc -l | sed -e 's/^ *//g'
find . | wc -l | sed -e 's/^[ \t]*//'
- find . : 현재 디렉토리(.)에 있는 파일을 찾는다.(하위 디렉토리, 숨겨진 파일도 표시) 점 사이 공백
- wc : word, line, character, and byte count , wc -l 라인 갯수 표시
- sed -e 다중편집 가능옵션 's 치환 /^ */ 스페이스로 만들어진 공간까지
- ^ : line 시작
- $ : line 끝
- [\t] : 탭
https://jinwoonote.tistory.com/entry/SED-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95
ex04 MAC
ifconfig -a | grep 'ether ' | tr -d '\t' | sed 's/ether //g'
ifconfig – a 모든 네트워크 인터페이스 구성 확인하기.
tr -d 문자열에서 지정한 문자를 삭제
(실행 파일 만들때 #!/bin/bash)
ex05 Can you create it ?
오직 "42"만 포함하고 그 밖의 어떠한 것도 포함하지 않는 파일을 작성하세요.
"\?$*'MaRViN'*$?\" 파일이름
파일이름에 원래는 특수문자가 포함되면 안되는데 앞에 \ 를 붙여주면 특수문자 사용 가능
echo -n 42 | tr -d '\n' > \"\\\?\$\*’MaRViN’\*\$\?\\\"
★틀린이유★
파일명 복붙하지 않고 하나하나 타이핑 해야됌
ex06 Skip
ls -l | awk " NR%2==1"
ex07 r_dwssap
cat /etc/passwd 명령어의 출력 결과에서 주석은 삭제하고 두 번째 행부터 시작하 여 다른 모든 행들은 출력하되, 각 login들 거꾸로 반전시키고 알파벳 역순으로 정렬한 후, FT_LINE1 과 FT_LINE2 을 포함한 그 사이의 값들만 남겨두세요. 이 때, 각 login은 ","로 구분되어야 하며 출력 결과는 "."로 끝나야 합니다.(큰따옴표 없이)
cat /etc/passwd | cut -d ":" -f 1 | awk "NR%2==0" | rev | sort -r |
cat /etc/passwd | cut -d ":" -f 1 | awk "NR%2==0" | rev | sort -r | xargs | sed -e 's/ /, /g' | sed 's/$/./g'
cat /etc/passwd | grep -v '#' | cut -d ":" -f 1 | awk "NR%2==0" | rev | sort -r | awk "NR>=$FT_LINE1 && NR<=$FT_LINE2" | xargs | sed -e 's/ /, /g' | sed 's/$/./g'
cat /etc/passwd | grep -v '#' | cut -d ":" -f 1 | awk "NR%2==0" | rev | sort -r | awk -v F1=$FT_LINE1 -v F2=$FT_LINE2 "NR>=F1 && NR<=F2" | xargs | sed -e 's/ /, /g' | sed 's/$/./g' | tr -d '\n'
환경변수 설정하는 방법
export [환경변수이름]=조건
ex) export FT_LINE1=4
&& and 연산자
|| or 연산자
awk -v : 변수선언
ex08 add_chelou
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"
5진수를 13진수로 바꿔라
댓글