ITPub博客

首页 > Linux操作系统 > Linux操作系统 > shell知识点小结1

shell知识点小结1

原创 Linux操作系统 作者:myownstars 时间:2013-06-17 13:31:27 0 删除 编辑

循环结构

For  do

Done

 

While do

Done

 

Until do

Done

 

打印从5到10

[oracle@ ~]$ cat t1.sh

#!/bin/bash

for i in `seq 5 10`

do

  echo $i

done

[oracle@ ~]$ cat t2.sh

#!/bin/bash

for i in {5..10}

do

  echo $i

done

[oracle@ ~]$ cat t3.sh

#!/bin/bash

for ((i=5;i<=10;i++))

do

  echo $i

done

[oracle@ ~]$ sh t3.sh

5

6

7

8

9

10

 

Seq命令

       seq [OPTION]... LAST  --默认从1开始

       seq [OPTION]... FIRST LAST

       seq [OPTION]... FIRST INCREMENT LAST

-f, --format=FORMAT

              use printf style. floating-point FORMAT (default: %g)

-s, --separator=STRING

              use STRING to separate numbers (default: \n)

-w, --equal-width

              equalize width by padding with leading zeroes

 

分隔符

[oracle@ ~]$ seq -s ";" 1 5

1;2;3;4;5

[oracle@ ~]$ seq -s '#' 5

1#2#3#4#5

[oracle@ ~]$ seq -s '#' 5 | sed -e 's/[0-9]*//g'

####

 

填充0对齐

[oracle@ ~]$ seq -w 5 10

05

06

07

08

09

10

 

[oracle@ ~]$ seq -f %05g 1 5

00001

00002

00003

00004

00005

 

生成数组

[oracle@ ~]$ b=($(seq 5 5 20))

[oracle@ ~]$ echo $b

5

[oracle@ ~]$ echo ${b[0]}

5

[oracle@ ~]$ echo ${b[@]}

5 10 15 20

 

[oracle@ ~]$ b=$(seq 5 5 20)

[oracle@ ~]$ echo $b

5 10 15 20

 

 

Basename

-- strip directory and suffix from filenames

[oracle@ ~]$ basename /usr/bin/sort

sort

[oracle@ ~]$ basename include/stdio.h .h

stdio

 

 

 

参数展开

${var:-word} --如果var存在且非Null则返回,否则返回word

${var:=word} --如果var不存在则为其赋值word并返回

${var:?message} --如果var不存在或为null,返回message

${var:+word} --如果var存在且非null则返回word,否则返回null

 

file = ${1:-/dev/tty}

 

[oracle@ ~]$ a=b
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${a:-word}
b
[oracle@ ~]$ echo ${b:-word}
word
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${b:=word}
word
[oracle@ ~]$ echo $a,$b
b,word

 

 

 

模式匹配

${var#pattern} 如果pattern匹配变量的开头处,则删除匹配的最短部分

${var%pattern} 如果pattern匹配变量的结尾处,则删除匹配的最短部分

[oracle@ ~]$ e=ttt.tt.abc
[oracle@ ~]$ echo ${e#t}
tt.tt.abc

[oracle@ ~]$ f=abc.ttt.tt
[oracle@ ~]$ echo ${f%t}
abc.ttt.t

 

参数变量

参数大于9时,以{}括起来;

$# --参数总数,每次shift都会将当前参数移后1位并将$#减1

$*/$@ -- 一次表示所有命令行参数 "hi you"会被当作两个参数对待

"$*" --将所有参数视为一个字符串"$1 $2 "

"$@" -- 将所有参数单独列出"$1" "$2"

$$--多半用于文件尾部,建立唯一性的文件名

$? --退出状态值0表示成功

 

test命令

可用于比较表达式 if test "$str1" = "$str2" 等同于 if ["$str1" ="$str2"]

还用于判断文件类型

-b 块设备文件 -c 字符设备  -d 目录 -e 文件存在 -f 一般文件

-g 设置setgid位 -u 设置setuid位

-h/-L 符号连接

-n 字符串为非null

-z 字符串为null

 

字符串比较 要加""并且通常添加一个固定前缀 比如 if [ "X$1" = "X$2" ]

n1 -gt n2

n1 -eq n2

n1 -lt n2

n1 -le n2

n1 -ne n2

 

Cut

-d 分隔符

-f 输出第N个字段

[oracle@justin ~]$ cut -d: -f 1 /etc/passwd | uniq -c

      1 root

      1 bin

      1 daemon

      1 adm

      1 lp

      1 sync

      1 shutdown

      1 halt

      1 mail

      1 news

      1 uucp

 

Sort

-t 分隔符

-K n,m 按照第n个字段的m个字符排序

-n 按数字排序

-r 降序排列

-u只要键值唯一,重复的读第一条;uniq则比较所有字段,都相同才唯一;uniq –c/-d/-u

-f 忽略字母大小写

-m 将已排序的输入文件合并为一个排序后输出

-o 将输出指定到一个文件

 

Sort –t: -k1,1 /etc/password—以用户名第一个字母排序

 

grep

^--匹配字首

$--匹配字尾

^$--匹配空行

.--单个字符

+--1个或多个字符

?--0个或1个字符

*--0个或多个字符

[^]—不包含指定字符

[:digit:]

[:alnum:]--匹配数字

[:alpha:]--匹配字符,[[:alpha:]]匹配所有英文字母

[:lower:]

[:upper:]

\{n,m\}--匹配前面字符n-m次

 

grep -v '^$' --删除空行

行最后3个字符为大写 [[:upper:]]\{3\}$

而[[:upper:]]\{3\,}$则变成了最后N(N>=3)个为大写

^abc|efg$--要么以abc开头,要么以efg结尾的行

^(abc|efg)$--该行要么为abc,要么为efg

社保号 ***-**-****,[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}

 

 

Sed

使用()支持向后引用,用数字替代()里的内容;

sed 's;\(/home\)/tolsoty;\1/lt;'--不必重复输入/home

默认sed只替换第一个匹配,末尾可添加数字或g,表示只替换第N个或全部替换;

[oracle@justin ~]$ echo justin read well. justin write well. > tmp.txt

[oracle@justin ~]$ more tmp.txt

justin read well. justin write well.

[oracle@justin ~]$ sed 's/justin/Justin/' < tmp.txt

Justin read well. justin write well.

[oracle@justin ~]$ sed 's/justin/Justin/2' < tmp.txt

justin read well. Justin write well.

[oracle@justin ~]$ sed 's/Justin/justin/g' < tmp.txt

justin read well. justin write well.

 

sed -n '10,42p' foo.xml --打印10-42行

使用//查找候选字符

sed '/foo/,/bar/ s/baz/quux/g'--查找包含foo和bar的行,然后将baz替换为quux

通过反义字符\指定有别于/的界定符

sed -n '\:tolstoy: s;;Tolstoy;p' /etc/passwd

 

指定行插入数据
1.在指定行前插入一行
sed '2 ittt' -i a.txt # 在第2行前插入ttt,并且将结果更新到a.txt(如果不想将插入真正更新到文件,去掉后面的-i选项就可以)

2.在指定行后插入一行
sed '2 attt' -i a.txt #在第2行后插入ttt,并且将结果更新到a.txt(如果不想更新原文件,去掉-i)

3.在指定的多行前面插入
sed 'n,m ittt' -i a.txt #看得懂了吧

4.在指定的多行后面插入
sed 'n,m attt' -i a.txt #看得懂了吧
http://blog.csdn.net/zbszhangbosen/article/details/7434191 

 

awk

FILENAME--当前输入文件名

FNR--当前文件的记录数

FS--字段分隔符,默认" ",只有在超过一个字符时,才计算作正则表达式

NF--当前记录字段数,$0为整条记录,$NF为当前记录最后一个字段

NR--job记录数

OFS--输出字段分隔符,默认" "

ORS--输出记录分隔符,默认\n

ARGC--输出参数总数

ARGV--参数向量,即数组,第0个元素为awk本身

 

过程用{}

指令使用’’

正则表达式使用//

 

数组为稀疏结构,即x[1]=314 x[1000]=3156而2-999都没有实际存储

delete array/array[index]用于删除整个数组和单个数组元素

输入和输出分隔符分别由-FS和-OFS指定

awk 'begin { FS = ':'; FS = '**' } { print $1, $5} ' /etc/passwd

awk –F: ‘{print “User”, $1, “is really”, $5} ’ /etc/passwd

 

使用AWK模拟wc

[oracle@ ~]$ more hello

asdf sdf

[oracle@ ~]$ wc hello

1 2 9 hello

[oracle@ ~]$ awk '{C+= length($0) + 1; W+=NF} END{print NR,W,C,FILENAME}' hello  --红体部分为循环操作(遍历输入文件),最后执行end

1 2 9 hello

 

使用awk筛选行

[oracle@ ~]$ awk '(FNR >= 7) && (FNR <= 1000) && /DISKSINFO/ {print FILENAME ":" FNR ":" $0}' md_backup.txt

md_backup.txt:8:                     'DISKSINFO' => {

md_backup.txt:345:                     'DISKSINFO' => {

 

[oracle@ ~]$ awk '/diskgroup_set|DISKSINFO/' md_backup.txt

@diskgroup_set = (

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

 

使用awk过滤重复行

[oracle@ ~]$ cat tmp.info

@diskgroup_set = (

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

[oracle@ ~]$ sort tmp.info | uniq

@diskgroup_set = (

                     'DISKSINFO' => {

[oracle@ ~]$ sort tmp.info | awk 'Last != $0 {print} {Last = $0}'

@diskgroup_set = (

                     'DISKSINFO' => {

 

 

将段落按第一行首字母排序

首先使用awk,RS=””将记录以空行分割,即每个段落合成一行;gsub为全局替换函数,类似sed的s/r/t/g

[oracle@justin ~]$ cat contact

justin

shanghai

021-44444

 

emily

beijing

010-444

 

zoo

nanjiang

020-4444

 

[oracle@justin ~]$ cat contact | awk -v RS="" '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{ gsub("^Z","\n"); print } '--第2个gsub没有起作用

emily^Zbeijing^Z010-444

 

justin^Zshanghai^Z021-44444

 

zoo^Znanjiang^Z020-4444

 

[oracle@justin ~]$ cat contact | awk -v RS=""  '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{print}' | sed 's/\^Z/\n/g'

emily

beijing

010-444

 

justin

shanghai

021-44444

 

zoo

nanjiang

020-4444

 

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15480802/viewspace-764096/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3320724