셸 프로 그래 밍 인 스 턴 스 수집
http://www.runoob.com/linux/linux-shell-variable.html
http://c.biancheng.net/cpp/shell/
1. 현재 디 렉 터 리 에 있 는 500 M 이상 의 파일 을 찾 아서 이 파일 들 의 이름 을 텍스트 파일 에 쓰 고 그 개 수 를 집계 합 니 다.
find ./ -size +500M -type f | tee file_list | wc -l
2. 디 렉 터 리 / tmp 에서 abc 로 시작 하 는 파일 100 개 를 찾 은 다음 이 파일 의 첫 줄 을 파일 new 에 저장 합 니 다.
for filename in `find /tmp -type f -name "abc*"|head -n 100`
do
sed -n '1p' $filename>>new
done
3. 파일 b 에 있 지만 파일 a 에 없 는 모든 줄 을 파일 c 로 저장 하고 c 의 줄 수 를 집계 합 니 다.
grep -xvf a b | tee c | wc -l
4. 파일 이 블록 이나 문자 장치 파일 인지 판단 하고 / dev 디 렉 터 리 에 복사 하면
read -p "input a file:" filename
if [ -b $filename -o -c $filename ]
then
cp $filename /dev/
fi
5. 10 분 간격 으로 모니터링 하고 모니터링 / usr 에서 5G 이상 이면 관리자 에 게 메 일 을 보 냅 니 다.
#!/bin/bash
while true
do
sleep 600
n=$(du -s /usr | cut -f1)
if [ $n -gt 5242880 ]
then
mail -s "greater" [email protected] < ~/filename # filename 。
fi
done
6. a. log 파일 에서 "WARNING" 또는 "FATAL" 을 포함 하 는 줄 을 추출 하고 "IGNOR" 를 포함 하지 않 은 줄 을 추출 한 다음 ":" 로 분 단 된 다섯 번 째 필드 를 추출 합 니 다.
grep -E 'WARNING|FATAL' a.log | grep -v IGNOR | awk -F ":" '{print $5}'
7. 스 크 립 트 를 작성 하여 간단 한 감법 연산 을 하고 입력 변 수 를 제시 해 야 합 니 다.
#!/bin/bash
read -p "input a number:" num1
read -p "input another number:" num2
let "num3=num1-num2"
echo $num3
8. 특정한 디 렉 터 리 에 있 는 파일 확장 자 를 bat 로 바 꾸 고 시간 을 파일 이름 으로 압축 하여 특정한 디 렉 터 리 에 저장 합 니 다.
#!/bin/bash
for file in $(ls $1)
do
new_file=${file%.*}.bat
mv ./$1/$file ./$1/$new_file
tmp=$(date +%y)
tar cvf ./$tmp.tar ./$1
done
9. 인터넷 에서 파일 을 다운로드 하여 지정 한 디 렉 터 리 에 저장
#!/bin/bash
url=http://rs1.bn.163.com/ent/2009/05/20_canquedege.wma
dir=~/
wget -P $dir $url
10. 한 수의 완수 여 부 를 판단 한다.1 - 1000 사이 의 완 수 를 인쇄 하 다.완 수 는 약수 의 합 이 자신의 두 배 와 같은 수 이다.(6,28,496)
#!/bin/bash
sub()
{
i=1;
sum=0;
while [ $i -le $num ]
do
let "m=num%i"
if [ $m -eq 0 ]
then
let "sum=sum+i"
fi
let "i=i+1"
done
let "a=2*num"
if [ $a -eq $sum ]
then
echo $num
fi
}
num=1
while [ $num -le 1000 ]
do
sub
let "num = num+1"
done
11. 행위 단위 로 파일 A 와 파일 B 의 교 집합, 집합, 차 집합 을 구한다.
# :
sort -m <(sort A | uniq) <(sort B | uniq) | uniq
# :
sort -m <(sort A | uniq) <(sort B | uniq) | uniq -d
# :
sort -m <(sort A | uniq) <(sort B | uniq) <(sort B | uniq) | uniq -u
12. 특정한 폴 더 에서 지정 한 문자열 이 있 는 파일 찾기
#!/bin/bash
for file in $(ls $2)
do
bname=$(grep -l $1 $2/$file)
basename $bname
done
# :
./tst 000 bash
# bash “000” 。
13. 새 그룹 을 class 1 로 추가 한 다음 에 이 그룹 에 속 하 는 30 명의 사용 자 를 추가 합 니 다. 사용자 이름 의 형식 은 stdxx 이 고 그 중에서 xx 는 01 에서 30 까지 입 니 다.
#!/bin/bash
groupadd class1
for i in {9901..9930}
do
xx=$(echo $i | sed 's/99//');
useradd -g class1 std$xx -p ""
done
14. 50 개의 계 정 을 자동 으로 삭제 하 는 기능 을 실현 한다.계 정 이름 은 stud 1 부터 stud 50 까지 입 니 다.
#!/bin/bash
i=0
while [ i -le 50 ]
do
let i++
userdel -r stud$i
done
15. 특정한 시스템 관리 자 는 매일 일정한 중복 작업 을 해 야 합 니 다. 아래 의 요구 에 따라 해결 방안 을 작성 하 십시오.
vim / etc / crontab 안에 다음 내용 을 추가 합 니 다:
#1)
50 16 * * * root rm -rf /abc/* 2>&1 &
#2)
00 8-18 * * * root cat /xyz/x1|awk '{print $1}' >> /backup/bak01.txt 2>&1 &
#3)
50 17 * * 1 root cd /data;tar -zcvf backup.tar.gz * 2>&1 &
#4)
55 17 * * * root umount /hdc 2>&1 &
#5) 8:00 --> , 8 ,8 。 。
chkconfig --level 2345 crond on
16. 셸 프로그램 을 설계 하여 매달 첫날 / etc 디 렉 터 리 의 모든 내용 을 백업 하고 압축 하여 / root / bak 디 렉 터 리 에 저장 하고 파일 이름 은 다음 과 같은 형식 yymmd 입 니 다.etc, yy 는 년, mm 는 월, d 는 일.셸 프로그램 fileback 은 / usr / bin 디 렉 터 리 에 저 장 됩 니 다.
vim /usr/bin/fileback.sh
#!/bin/bash
#fileback.sh
#file executable: chmod 755 fileback.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
filename=`date +%y%m%d`_etc.tar.gz
cd /etc/
tar -zcvf $filename *
mv $filename /root/bak/
------------------------------------------------------
vim /etc/crontab
* * 1 * * root ./fileback.sh &
17. 한 일반 사용자 가 매주 새벽 0 시 0 분 에 정기 적 으로 백업 / user / backup 을 / tmp 디 렉 터 리 에 백업 하려 면 어떻게 해 야 합 니까?우선 루트 가 아 닌 사용자 가 crontab 파일 을 만 드 는 방법 을 말씀 드 리 겠 습 니 다.
[sword@localhost ~]$ vim cronfile
[sword@localhost ~]$ crontab cronfile
[sword@localhost ~]$ crontab -e no crontab for sword - using an empty one crontab: installing new crontab
# :
[root@localhost cron]# crontab -u sword -l
# :
/var/spool/cron/sword 。
vim ~/shit.sh
#!/bin/bash
cp /user/backup/* /tmp/
--------------------------------------------
crontab -e
0 0 * * 0 ~/shit.sh &
18. 셸 프로그램 을 설계 하여 / userdata 디 렉 터 리 에 50 개의 디 렉 터 리, 즉 user 1 ~ user 50 을 만 들 고 각 디 렉 터 리 의 권한 을 설정 합 니 다. 그 중에서 다른 사용자 의 권한 은 읽 기 입 니 다.파일 소유자 의 권한 은 읽 기, 쓰기, 실행 입 니 다.파일 소유자 가 있 는 그룹의 권한 은 읽 기, 실행 입 니 다.
#!/bin/bash
for ((i=1;i<=50;i++))
do
mkdir -p /usrdata/user$i
cd /usrdata
chmod 754 user$i
done
19. 한 파일 의 내용 은 모두 [202.205.151.21] - [23: 59: 22] - "HTTP GET" - "Mozilla"... SHELL 명령 을 써 서 가장 많은 IP 10 개 를 찾 습 니 다.
awk -F "--" '{print $1}' shit | sort | uniq -c | sort -r | sed -n '1,10p'
20. / tmp 경로 아래 800 개의 파일 이 있 습 니 다. 파일 이름 의 형식 은: filename 입 니 다.YYYYMMDD_시리 얼 번호 (001 부터 999 까지). dat, 예 를 들 어 filename20040108_089.dat。지금 이 파일 들 의 이름 을 바 꾸 려 고 합 니 다. 새 파일 이름 의 형식 은: filename 입 니 다.오늘 (현재 날짜)시리 얼 번호 (500 부터 999 까지 도착 하면 001 부터). dat, 예 를 들 어 filename20040108_089. dat 를 filename 로 변경20041222_589. dat, 새 파일 이름 의 시리 얼 번호 순 서 는 원래 의 것 과 일치 해 야 합 니 다. 즉, 정렬 처 리 를 해 야 합 니 다.
#!/usr/bin/bash
DEST_FILE_PART2="_`date '+%Y%m%d'`_"
EXT_NAME=".dat"
SRC_FILE_LIST=`find /tmp -name "*_*_*$EXT_NAME" -print`
for each in $SRC_FILE_LIST; do
DEST_FILE_PART1=`echo $each | awk -F"_" '{print $1}'`
OLD_NUM=`echo $each | awk -F"_" '{print $3}' | awk -F"." '{print $1}'`
DEST_FILE_PART3=`expr $OLD_NUM + 500`
[ $DEST_FILE_PART3 -gt 999 ] && DEST_FILE_PART3=`expr $OLD_NUM - 499`
&& DEST_FILE_PART3=`printf d $DEST_FILE_PART3`
DEST_FILE=$DEST_FILE_PART1$DEST_FILE_PART2$DEST_FILE_PART3$EXT_NAME
echo "mv $each to $DEST_FILE"
mv $each $DEST_FILE
done
나 는 이렇게 해도 된다 고 생각한다.
#!/bin/bash
new_file=$(date +20%y%m%d);
for file in $(ls ~/bash)
do
i=$(echo "$file" | sed 's/.*_[0-9]*_\([0-9]*\).dat/\1/') #
i=$(echo $i | sed 's/^0*\([0-9]*\)/\1/') # ‘0’,
let "ii=i+500"
if [ $ii -gt 999 ]
then
let "ii=ii-999"
fi
ii=`printf d $ii` # ‘0’
update=$(echo "$file" | sed 's/\(.*\)_[0-9]*_[0-9]*.dat/\1_'$new_file'_'$ii'.dat/')
mv ~/bash/$file ~/bash/$update
done
21. 요구: 한 스 크 립 트 에서 이 프로그램 을 완성 합 니 다. 1. 파일 user. list 에서 지정 한 사용자 이름과 사용자 그룹 을 꺼 내 고 이 사용자 와 그룹 을 규칙 에 따라 시스템 에 추가 합 니 다. 2. password. list 에서 지정 한 사용자 암 호 를 읽 습 니 다.user. list 아래 zhangsan adminuser, dbuser, updatauser lisi dbuser, updatauser wanger updatauser, wheel
#!/bin/bash
#group add
for x in ‘awk ‘{print $2}’ user.list | sed ’s/,/
/g’ | sort | uniq -c|sed ’s/[^a-zA-Z]//g”
do
groupadd $ x &> /dev/null
done
#back message
if (($ ? == 0 ))
then
echo “Group Ok!!”
else
exit 1
fi
#user add
for i in ‘awk ‘{print $1}’ user.list’
do
for y in ‘awk ‘{print $2}’ password.list’
do
useradd $i &> /dev/null
echo $y | passwd –stdin $i &> /dev/null
done
done
#back message
if (( $ ? == 0))
then
echo “User Ok!”
else
exit 1
fi
#add users to groups
for ((q=1;q<=3;q++))
do
usermod -G ‘awk “NR==$q {print $2}” user.list | awk ‘{print $ 2}” ‘awk “NR==$q {print $ 1}” user.list | awk ‘{print $1}” &> /dev/null
done
if (($?==0))
then
echo “All Finished!”
fi
22. 두 소수 크기 를 비교한다.
awk -v num1=6.6 -v num2=5.5 'BEGIN{print(num1>num2)?"0":"1"}'
echo "0.14 > 0.15" | bc
expr 1.2 \< 1.3
#!/bin/bash
# cpuser point
logname="/home/forum/log/lpointlog.wf"
flagfile="/home/forum/log/lognum.txt"
lodnum=sed -n "1,1 p"$flagfile
newnum=wc -l ${logname}
echo $newnum >$flagfile
totalnum=expr $newnum -$oldnum
tail -n $totalnum $logname |grep "POINT_THREAD WARNING"
if [$?==0]
then
mail -s "cpuser point " , !" test@aa.com</dev/null
fi>
명령 행 을 바 꾸 는 데 반 따옴표, if [$? = 0] 는 if [$? = 0] 로 써 서 마지막 명령 이 실 행 했 는 지 여 부 를 판단 해 야 합 니 다.
마지막 두 번 째 줄 은 > / dev / null 이 고 마지막 fi 뒤의 > 제거 해 야 합 니 다.
#!/bin/sh
DIRNAME=`ls /root | grep bak`
if [ -z "$DIRNAME" ] ; then
mkdir /root/bak
cd /root/bak
fi
YY=`date +%y`
MM=`date +%m`
DD=`date +%d`
BACKETC=$YY$MM$DD_etc.tar.gz
tar zcvf $BACKETC /etc
echo "fileback finished!"
(2) 작업 타이머 작성:
echo "0 0 1 * * /bin/sh /usr/bin/fileback" >;
/root/etcbakcron crontab /root/etcbakcron
# crontab -e :
0 1 * * * /bin/sh /usr/bin/fileback
(1) 우선 신뢰 관계 구축 1 VS 10. 단, 기계 2 대 (192.168.1.6, 192.168.1.4) 로 시험
#ssh-keggen -b 1024 -t rsa //( root )
#cd .ssh/
#ls
id_rsa
id_rsa.pub
knows_host
#scp id_rsa.pub 192.168.1.4:/root/.ssh/192.168.1.6
여기 서 공개 키 를 신뢰 할 수 있 는 호스트 의 IP 주소 로 지 었 습 니 다.
지금 192.168.1.4 기계 에 로그 인 했 습 니 다.
#cd .ssh/
#cat 192.168.1.6 >> authorized_keys
그리고 192.168.1.6 기계 로 돌 아 왔 다.
#ssh 192.168.1.4
이렇게 하면 됩 니 다. 안에 권한 문제 가 있 을 수 있 습 니 다.일반. ssh / 폴 더 755, authorizedkeys 600 또는 644
(2) 스 크 립 트 는 다음 과 같 습 니 다.
#!/bin/sh
#script:df_check.sh
FSMAX="80"
remote_user='root'
remote_ip=(192.168.1.2 192.168.1.3 192.168.1.4 .......) // ip
ip_num='0'
while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)" ]
do
read_num='1'
ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h >/tmp/diskcheck_tmp
grep '^/dev/*' /tmp/diskcheck_tmp|awk '{print $5}'|sed 's/\%//g' >
/tmp/diskcheck_tmp_num
while [ "$read_num" -le $(wc -l < /tmp/diskcheck_tmp_num)] //
do
size=$(sed -n "$read_num"'p' /tmp/diskcheck_tmp_num)
if [ "$size" -gt "$FSMAX" ]
then
$(grep '^/dev/*' /tmp/diskcheck_tmp|sed -n $read_num'p' >
/tmp/disk_mail)
$(echo $(remote_ip[$ip_num]) >> /tmp/disk_mail)
$(mail -s "diskcheck_alert" admin </tmp/disk_mail)
fi
read_num=$(expr $read_num + 1)
done
ip_num=$(expr $ip_num + 1)
done
(3) crontab 에 넣는다
#######################################################################
\ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # 스 크 립 트 를 10 분 마다 실행 하 게 합 니 다 \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ # \ #
cron 표 에서:
0/10 * * * * /home/codefei/diskcheck.sh 2>&1
#!/bin/sh
FILENAME=
echo “Input file name:”
read FILENAME
if [ -c "$FILENAME" ]
then
cp $FILENAME /dev
fi
저자: 생황 은 여러분 과 저 와 기술적 인 문 제 를 교류 하 는 것 을 환영 합 니 다 QQ: 1348612681https://www.runoob.com/mysql/mysql-install.html https://www.jianshu.com/p/276d59cbc529 저자 증언: NULLPOINTEEXCEPTION!(농담 입 니 다. 셸 에 자바 이상 이 왜 생 겼 습 니까?)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.