Linux常用Shell脚本

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

577

578

579

580

581

582

583

584

585

586

587

588

589

590

591

592

593

594

595

596

597

598

599

600

我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本。如何学好脚本,最关键的是就是大量的练习 和实践。根据以下脚本我们可以拓展,这样我们提高的很快!举一反三!

 

1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。

参考程序:

C代码  收藏代码

#!/bin/sh 

FILENAME= 

echo “Input file name:” 

read FILENAME 

if
[ -c "$FILENAME"

then 

cp $FILENAME /dev 

fi  

 

2.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。

参考答案:

C代码  收藏代码

#!/bin/sh 

i=1 

groupadd class1 

while
[ $i -le 30 ] 

do

if
[ $i -le 9 ] ;then 

USERNAME=stu0${i} 

else

USERNAME=stu${i} 

fi 

useradd $USERNAME 

mkdir /home/$USERNAME 

chown -R $USERNAME /home/$USERNAME 

chgrp -R class1 /home/$USERNAME 

i=$(($i+1)) 

done 

3.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。

 

参考程序:

C代码  收藏代码

#!/bin/sh 

i=1 

while
[ $i -le 50 ] 

do

userdel -r stud${i} 

i=$(($i+1 )) 

done 

4.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:

(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;

(2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;

(3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

(4)在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc);

(5)在早晨8:00前开机后启动。

参考答案:

解决方案:

(1)用vi创建编辑一个名为prgx的crontab文件;

(2)prgx文件的内容:

C代码  收藏代码

50 16 * * * rm -r /abc/* 

0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt 

50 17 * * * tar zcvf backup.tar.gz /data 

55 17 * * * umount /dev/hdc 

 

(3)由超级用户登录,用crontab执行 prgx文件中的内容:

[email protected]:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。

5.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。

 

参考答案:

(1)编写shell程序fileback:

C代码  收藏代码

#!/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)编写任务定时器:

C代码  收藏代码

echo “0 0 1 * * /bin/sh /usr/bin/fileback” >; /root/etcbakcron 

crontab /root/etcbakcron 

或使用crontab -e 命令添加定时任务: 

0 1 * * * /bin/sh /usr/bin/fileback 

 

6.有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?

 

参考答案:

 

(1)第一种方法:

C代码  收藏代码

用户应使用crontab –e 命令创建crontab文件。格式如下: 

0 0 * * sun cp –r /user/backup /tmp 

 

(2)第二种方法:

用户先在自己目录下新建文件file,文件内容如下:

C代码  收藏代码

0 * * sun cp –r /user/backup /tmp 

然后执行 crontab file 使生效。

 

7.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

 

参考答案: 建立程序 Pro16如下:

C代码  收藏代码

#!/bin/sh 

i=1 

while
[ i -le 50 ] 

do

if
[ -d /userdata ];then 

mkdir -p /userdata/user$i 

chmod 754 /userdata/user$i 

echo “user$i” 

let “i = i + 1″ (或i=$(($i+1)) 

else

mkdir /userdata 

mkdir -p /userdata/user$i 

chmod 754 /userdata/user$i 

echo “user$i” 

let “i = i + 1″ (或i=$(($i+1)) 

fi 

done 

 

8、mysql备份实例,自动备份mysql,并删除30天前的备份文件

C代码  收藏代码

#!/bin/sh 

  

#auto backup mysql 

#wugk  2012-07-14 

#PATH DEFINE 

  

BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` 

MYSQLDB=www 

MYSQLPW=backup 

MYSQLUSR=backup 

  

if[ $UID -ne 0 ];then 

echo This script must use administrator or root user ,please exit

sleep 2 

exit

fi 

  

if[ ! -d $BAKDIR ];then 

mkdir -p $BAKDIR 

else

echo This is $BAKDIR exists ,please exit
…. 

sleep 2 

exit

fi 

  

###mysqldump backup mysql 

  

/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >/data/backup/mysql/`date +%Y-%m-%d`/www_db.sql 

  

cd $BAKDIR ; tar -czf  www_mysql_db.tar.gz *.sql 

  

cd $BAKDIR ;find  . -name “*.sql” |xargs rm -rf[ $? -eq 0 ]&&echo “This `date +%Y-%m-%d` RESIN BACKUP is SUCCESS” 

  

cd /data/backup/mysql/ ;find . -mtime +30 |xargs rm -rf 

 

9、自动安装Nginx脚本,采用case方式,选择方式,也可以根据实际需求改成自己想要的脚本

C代码  收藏代码

#!/bin/sh 

  

###nginx install shell 

###wugk 2012-07-14 

###PATH DEFINE 

  

SOFT_PATH=/data/soft/ 

NGINX_FILE=nginx-1.2.0.tar.gz 

DOWN_PATH=http://nginx.org/download/ 

  

if[ $UID -ne 0 ];then 

echo This script must use administrator or root user ,please exit

sleep 2 

exit

fi 

  

if[ ! -d $SOFT_PATH ];then 

mkdir -p $SOFT_PATH 

fi 

  

download () 

cd $SOFT_PATH ;wget $DOWN_PATH/$NGINX_FILE 

  

install () 

yum install pcre-devel -y 

cd $SOFT_PATH ;tar xzf $NGINX_FILE ;cd nginx-1.2.0/ &&./configure –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-http_ssl_module 

[ $? -eq 0 ]&&make &&make install 

  

start () 

lsof -i :80[ $? -ne 0 ]&&/usr/local/nginx/sbin/nginx 

  

stop () 

ps -ef |grep nginx |grep -v grep |awk ‘{print $2}’|xargs kill -9 

  

exit
() 

echo $? ;exit

  

###case menu ##### 

  

case
$1 in 

download ) 

download 

;; 

  

install ) 

install 

;; 

  

start ) 

start 

;; 

stop ) 

stop 

;; 

  

* ) 

  

echo “USAGE:$0 {download or install or start or stop}” 

exit

esac 

 

10、批量解压tar脚本,批量解压zip并且建立当前目录。

C代码  收藏代码

#!/bin/sh 

PATH1=/tmp/images 

PATH2=/usr/www/images 

for
i in `ls ${PATH1}/*` 

do

tar xvf  $i  -C $PATH2 

done 

 

这个脚本是针对所有tar文件在一个目录,但是实际情况中,有可能在下级或者更深的目录,我们可以使用find查找

C代码  收藏代码

#!/bin/sh 

PATH1=/tmp/images 

PATH2=/usr/www/images 

for
i in `find  $PATH1  -name  ”*.tar” ` 

do

tar xvf  $i  -C $PATH2 

done 

 

如何是zip文件,例如123189.zip 132342.zip 等等批量文件,默认unzip直接解压不带自身目录,意思是解压123189.zip完当前目录就是图片,不能创建123189目录下并解压,可以用shell脚本实现

C代码  收藏代码

#!/bin/sh 

PATH1=/tmp/images 

PATH2=/usr/www/images 

cd $PATH1 

  

for
i in `find  . -name  ”*.zip”|awk  -F.  {print $2} ` 

do

  

mkdir -p   PATH2$i 

  

unzip -o  .$i.zip  -d   PATH2$i 

done  

 

原创文章转载请注明: Linux常用Shell脚本珍藏 | 专注Unix/Linux领域

 

ssh 批量上传文件

上传文件大多数用的是ftp,但是用ftp有一点不好,就是本地和远程的目录要对应,这样就要在多个目录下去切换,这样挺麻烦的,如果不注意的话,很有可能传错。所以想了个办法利用scp来批量上传文件或者目录。

 

一,scp上传不要输入密码

如果要用scp来上传文件,第一步就要去掉scp上传时要输入密码。要不然就没办法批量上传了。具体请参考:ssh 不用输入密码

 

二,ssh批量上传脚本

 

1,要上传的文件列表放到一个test文件中

C代码  收藏代码

[email protected]:/home/zhangy# cat test   

/home/zhangy/test/aaa   

/home/zhangy/test/nginx.conf   

    

/home/zhangy/test/test.sql   

/home/zhangy/test/pa.txt   

/home/zhangy/test/password   

 

上面就要上传的文件。

 

2,批量上传的脚本

 

vim file_upload.sh

C代码  收藏代码

#!/bin/sh 

  

DATE=`date +%Y_%m_%d_%H` 

  

if
[ $1 ] 

then 

  for
file in $(sed ‘/^$/d‘
$1)     //去掉空行 

  do

    if
[ -f $file ]                 //普通文件 

    then 

      res=`scp $file $2:$file`      //上传文件 

      if
[ -z $res ]                //上传成功 

      then 

        echo $file >> ${DATE}_upload.log  
//上传成功的日志 

      fi 

    elif [ -d $file ]              //目录 

    then 

      res=`scp -r $file $2:$file` 

      if
[ -z $res ] 

      then 

        echo $file >> ${DATE}_upload.log

      fi 

    fi 

  done 

else

  echo "no file"
>> ${DATE}_error.log

fi 

 

上传成功后,返回的是一个空行,上传不成功,什么都不返回

 

3,上传的格式

C代码  收藏代码

./file_upload.sh test 192.168.1.13   

test是上传列表文件,192.168.1.13文件要传到的地方。

0

转载请注明

作者:海底苍鹰

地址:http://blog.51yip.com/linux/1356.html

 

1. 转换文件大小写:

A script to convert the specified filenames to lower case.

 

C代码  收藏代码

#!/bin/sh 

 # lowerit 

# convert all file names in the current directory to lower case 

# only operates on plain files--does not change the name of directories 

# will ask for verification before overwriting an existing file 

for
x in `ls` 

do

    if
[ ! -f $x ]; then 

        continue

    fi 

    lc=`echo $x  | tr ‘[A-Z]‘
‘[a-z]‘

    if
[ $lc != $x ]; then 

        mv -i $x $lc 

    fi 

done 

 

 

or

 

C代码  收藏代码

if
test $# = 0 

then 

    echo "Usage $0: <files>"
1>&2 

    exit

fi 

  

for
filename in "[email protected]"

do

    new_filename=`echo "$filename"
| tr A-Z a-z` 

    test "$filename"
= "$new_filename"
&& continue

    if
test -r "$new_filename"

    then 

        echo "$0: $new_filename exists"
1>&2 

    elif test -e "$filename"

    then 

        mv "$filename"
"$new_filename"

    else

        echo "$0: $filename not found"
1>&2 

    fi 

done 

 

 

2. 看网站 Watch a Website

 

A script to repeated download a webpage until it matches a regex then notify an e-mail address.

For example to get e-mail when Kesha tickets (not for
yourself of course) go on sale you might run:

 

C代码  收藏代码

% watch_website.sh http://ticketek.com.au/ ‘Ke[sS$]+ha‘ [email protected] 

  

  

repeat_seconds=300  #check every 5 minutes 

  

if
test $# = 3 

then 

    url=$1 

    regexp=$2 

    email_address=$3 

else

    echo "Usage: $0 <url> <regex>"
1>&2 

    exit

fi 

  

while
true

do

    if
wget -O- -q "$url"|egrep "$regexp"
>/dev/null 

    then 

        echo "Generated by $0"
| mail -s "$url now matches $regexp"
$email_address 

        exit

    fi 

    sleep $repeat_seconds 

done 

 

 

3. 转GIF到PNG convert GIF files to PNG

 

This scripts converts GIF files to PNG files via the intermediate PPM format.

 

C代码  收藏代码

if
[ $# -eq 0 ] 

then 

    echo "Usage: $0 files..."
1>&2 

    exit

fi 

  

if
! type giftopnm 2>/dev/null 

then 

    echo "$0: conversion tool giftopnm not found "
1>&2 

    exit

fi 

  

# missing "in ..." defaults to in "[email protected]" 

for

do

    case
"$f" in 

    *.gif) 

        # OK, do nothing 

        ;; 

    *) 

        echo "gif2png: skipping $f, not GIF"

        continue

        ;; 

    esac 

  

    dir=`dirname "$f"

    base=`basename "$f"
.gif` 

    result="$dir/$base.png"

  

    giftopnm "$f"
| pnmtopng > $result && echo "wrote $result"

done 

 

 

4.  计数 Counting

 

A utility script to print the sub-range of integers specified by its arguments.

Useful to use on the command line or from other scripts

 

C代码  收藏代码

if
test $# = 1 

then 

    start=1 

    finish=$1 

elif test $# = 2 

then 

    start=$1 

    finish=$2 

else

    echo "Usage: $0 <start> <finish>"
1>&2 

    exit

fi 

  

for
argument in "[email protected]"

do

    if
echo "$argument"|egrep -v ‘^-?[0-9]+$‘
>/dev/null 

    then 

        echo "$0: argument ‘$argument‘ is not an integer"
1>&2 

        exit

    fi 

done 

  

number=$start 

while
test $number -le $finish 

do

    echo $number 

    number=`expr $number + 1`    # or number=$(($number + 1)) 

done 

 

 

5. 字频率 Word Frequency

Count the number of time
each different word occurs in the files given as arguments.

 

C代码  收藏代码

sed ‘s/ /\n/g‘
"[email protected]"|      # convert to one word per line 

tr A-Z a-z|               # map uppercase to lower case

sed "s/[^a-z‘]//g"|       # remove
all characters except a-z and ‘   

egrep -v ‘^$‘|             # remove
empty lines 

sort|                     # place words in alphabetical order 

uniq -c|                  # use uniq to count how many times each word occurs 

sort -n                   # order words in frequency of occurrance 

 For example

 

 

C代码  收藏代码

% cd /home/cs2041/public_html/lec/shell/examples 

% ./word_frequency.sh dracula.txt|tail 

   2124 it 

   2440 that 

   2486 in 

   2549 he 

   2911 a 

   3600 of 

   4448 to 

   4740 i 

   5833 and 

   7843 the 

 

 

6. Finding

 

Search $PATH for
the specified programs

C代码  收藏代码

if
test $# = 0 

then 

    echo "Usage $0: <program>"
1>&2 

    exit

fi 

  

for
program in "[email protected]"

do

    program_found=‘‘

    for
directory in `echo "$PATH"
| tr ‘:‘ ‘ ‘

    do

        f="$directory/$program"

        if
test -x "$f"

        then 

            ls -ld "$f"

            program_found=1 

        fi 

    done 

    if
test -z $program_found 

    then 

        echo "$program not found"

    fi 

done 

 

Alternative implementation using
while, and a cute use of grep and ||

C代码  收藏代码

if
test $# = 0 

then 

    echo "Usage $0: <program>"
1>&2 

    exit

fi 

  

for
program in "[email protected]"

do

    echo "$PATH"

    tr ‘:‘
‘\n‘

    while
read directory 

    do

        f="$directory/$program"

        if
test -x "$f"

        then 

            ls -ld "$f"

        fi 

    done| 

    egrep ‘.‘
|| echo "$program not found"

done 

 

And another implementation using
while, and a cute use of grep and ||

C代码  收藏代码

if
test $# = 0 

then 

    echo "Usage $0: <program>"
1>&2 

    exit

fi 

for
program in "[email protected]"

do

    n_path_components=`echo $PATH|tr -d -c :|wc -c` 

    index=1 

    while
test $index -le $n_path_components 

    do

        directory=`echo "$PATH"|cut -d: -f$index` 

        f="$directory/$program"

        if
test -x "$f"

        then 

            ls -ld "$f"

            program_found=1 

        fi 

        index=`expr $index + 1` 

    done 

    test -n $program_found || echo "$program not found"

done 

 

来源: http://www.cse.unsw.edu.au/~cs2041/12s2/lec/shell/examples.notes.html

  

时间: 2024-10-10 19:11:05

Linux常用Shell脚本的相关文章

Linux系统shell脚本编程——生产实战案例

Linux系统shell脚本编程--生产实战案例     在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要结合shell脚本来实现批量检查的功能,那么今天就来做个小小的实验. 1.开发脚本前准备 一般大家都知道,测试主机是否在线,常用的命令无非就是ping.nmap,因此,首先找一个地址来测试下ping命令的效果 [[email protected] scripts]

监控Oracle数据库的常用shell脚本-转

8个DBA最常用的监控Oracle数据库的常用shell脚本--转 分类: Linux 一.8个重要的脚本来监控Oracle数据库: 1.检查实例的可用性 2.检查监听器的可用性 3.检查alert日志文件中的错误信息 4.在存放log文件的地方满以前清空旧的log文件 5.分析table和index以获得更好的性能 6.检查表空间的使用情况 7.找出无效的对象 8.监控用户和事务 二.DBA需要的Unix基本知识 基本的UNIX命令,以下是一些常用的Unix命令: ps--显示进程 grep-

linux学习—shell脚本知识点总结

Shell脚本 --Shell脚本有点像早期的批处理文件,将一些命令汇总起来一次执行,但Shell有更强大的功能,可以类似于程序的编写,不需要编译就能执行,使用起来很方便,可以简化我们日常的管理工作. 目录 什么是Shell 脚本的运行方法 #!(读shabang)的作用详解 结合案例分析变量类型 特殊变量及其[email protected] $*的区别 退出状态 算数运算 test和[ expression ]判断 一.什么是Shell 我们知道管理整个计算机硬件的其实是核心(kernel)

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

常用shell脚本

获取IP地址和子网掩码 ifconfig eth0 | grep "inet addr" | awk -F "[ : ]+"  '{print $4 "\\" $8}' 常用shell脚本,布布扣,bubuko.com

Linux/Unix shell 脚本中调用SQL,RMAN脚本

Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例. 一.由shell脚本调用sql,rman脚本 [python] view plain copy print? 1.shell脚本调用sql脚本 #首先编辑sql文件 [email protecte

linux:shell脚本的一些语法

读取文件的第一行并赋值给变量 var=`head -1 filename` #`不是单引号,是Esc下方的一个按键,为命令替换符,将命令行执行结果赋给var 读取文件的第N行并赋值给变量 var=`sed -n Np filename` #把N替换成数字 逐行读取文件 while read line do echo $line done < filename linux:shell脚本的一些语法,布布扣,bubuko.com

Linux下Shell脚本输出带颜色文字

Linux下Shell脚本输出带颜色文字 文本终端的颜色可以使用"ANSI非常规字符序列"来生成. 举例:    "echo -e \033[44;37;5m BLUE \033[0m" "echo -e \033[44;37;5m BLUE \033[0m BLACK" 需要修改的地方是红色带下划线的部分,其中[***m部分的内容换成下面的数字,后面的内容是自己想要上色的内容. 以上命令设置作用如下:背景色为蓝色,前景色为白色,字体闪烁,输出字

linux 之shell脚本练习

一. #!/bin/bash#自动添加用户,并使初始密码为用户账户名,且用户登录时强制其更改密码i=1while [ $i -le 15 ]do if [ $i -le 9 ]  then  useradd user0$i  echo "user0$i" | passwd --stdin user0$i &> /dev/null  chage -d 0 user0$i else  useradd user$i  echo "user$i" | pass