码迷,mamicode.com
首页 > 系统相关 > 详细

《shell编程入门》学习总结

时间:2015-10-25 19:31:17      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:shell编程入门;linux运维;学习总结

以下图为本章节的知识点结构图。

技术分享

  【前言】我们在linux上敲过的命令是有记录的。默认保存1000条。保存位置:.bash_history。但是前提是我们得正常退出。

  【shell是什么?】shell是一个脚本,不是一种正式的编程语言。shell也就是一些命令的集合,能够帮助我们更加方便的管理服务器。

  【shell特性】 !! 是执行上一条命令。

[root@localhost ~]# ls -l 11.txt
-rw-r--r--. 1 root root 1536 Oct 18 03:27 11.txt
[root@localhost ~]# !!
ls -l 11.txt
-rw-r--r--. 1 root root 1536 Oct 18 03:27 11.txt


n:执行第n条历史命令的意思。 

[root@localhost ~]# !632
pwd
/root

!字符串:执行最近的字符串命令。

[root@localhost ~]# !ls
ls -l 11.txt
-rw-r--r--. 1 root root 1536 Oct 18 03:27 11.txt

alias 命令别名 =‘具体别名’-----做别名。使用unalias解除别名(unalias 别名)。

[root@localhost ~]# alias senlin=‘ls‘
[root@localhost ~]# senlin
11  11.txt  1.txt 2.txt  anaconda-ks.cfg  install.log install.log.syslog

*:匹配多个或者零个字符。?:匹配一个字符。

[root@localhost ~]# ls 1*
11.txt  1.txt
11:
11
[root@localhost ~]# ls 1?
11
[root@localhost ~]# echo "aaa"> 11.txt
[root@localhost ~]# echo "aaa">>11.txt
[root@localhost ~]# cat 11.txt
aaa
aaa

| :管道符。把前面的命令结果丢给后面的。

[root@localhost ~]# cat 11.txt|wc -l
2

作业控制:当运行一个进程时,你可以使它暂停(按 Ctrl+z),然后使用 fg 命令恢复它,利用 bg 命令使他到后台运行,你也可以使它终止(按 Ctrl+c)。多个被暂停的任务会有编号,使用 jobs 命令可以看到两个任务,那么使用 bg 或者 fg 的时候,就需要在后面加一个编号了,使用 bg 2 把第二个被暂停的任务丢到后台跑起来了,丢入后台需要使用在命令后边加一个&符号,中间有个空格。先使用“fg 编号‘’把任务调到前台,然后使用  Ctrl + c  结束任务。另外,关闭到当前的 shell,再次打开另一个 shell时,使用 jobs 命令并不会显示在后台运行或者被暂停的任务,要想停掉它的话,则需要先知道其 pid,然后使用 kill 命令杀死那个进程。

  【shell变量】系统预设命令:PWD,HOME,LOGNAME

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

env:列出所有系统变量。注:用户不同,值不同。

[root@localhost ~]# env
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.200.1 57505 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
SELINUX_LEVEL_REQUESTED=
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.200.1 57505 192.168.200.131 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env


PATH:决定了 shell 将到哪些目录中寻找命令或程序;
HOME
:当前用户主目录 
HISTSIZE
:历史命令记录数 
LOGNAME
:当前用户的登录名 
HOSTNAME
:指主机的名称 
SHELL
:前用户 Shell 类型 
LANG
:语言相关的环境变量,多语言可以修改此环境变量 
MAIL
:当前用户的邮件的存放目录 
PWD
:当前所在目录;

set:列出所有预设命令,包括自定义的变量。虽然我们自定义变量,但是也只能在当前的shell使用。

设置的变量一直生效:需要在 /etc/profile 文件最末行加入export myname=senlin  然后运行 source /etc/profile 就可以生效了。

[root@localhost ~]# echo "exportmyname=senlin">>/etc/profile
[root@localhost ~]# source !$
source /etc/profile
[root@localhost ~]# bash
[root@localhost ~]# echo $myname
senlin
[root@localhost ~]# exit
exit

自定义变量的规则:

a. 设定变量的格式为:a=b ,其中 a 为变量名,b 为变量的内容,等号两边不能有空格;
b.
变量名只能由英、数字以及下划线组成,而且不能以数字开头;
c.
当变量内容带有特殊字符(如空格)时,需要加上单引号;

注意事项:

1.变量内容中本身带有单引号,这就需要用到双引号了;
2.
变量内容中需要用到其他命令运行结果则可以使用反引号;
3.
变量内容可以累加其他变量的内容,需要加双引号;
4.
单引号和双引号的区别。用双引号时不会取消掉里面出现的特殊字符的本身作用,而使用单引号则里面的特殊字符全部失去它本身的作用。

  【系统和用户的环境变量配置文件】

系统变量的保存位置:

/etc/profile:这个文件预设了几个重要的变量,例如 PATHUSERLOGNAMEMAIL INPUTRC
HOSTNAME
HISTSIZEumask 等等。上节已经列出。

/etc/bashrc:这个文件主要预设 umask以及 PS1

.bash_profile:定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用

于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次。

.bashrc:该文件包含专用于你的 shell bash 信息,当登录时以及每次打开新的 shell ,该该文件被读取。例如你可以将用户自定义的 alias 或者自定义变量写到这个文件中。

.bash_history:记录命令历史用的。

.bash_logout:当退出 shell时,会执行该文件。可以把一些清理的工作放到这个文件中。

  【shell中的特殊符号】

* :零个或多个任意字符。

[root@localhost ~]# ls -d 1*
11  11.txt  1.txt

? :一个任意字符(数字或者字符)。

[root@localhost ~]# ls -d 1?
11

#:注释符号。

[root@localhost ~]# ls -l #列出消息信息
total 72
drwxr-xr-x. 3 root root  4096 Oct 9 01:52 11
-rw-r--r--. 1 root root     8 Oct 24 18:48 11.txt
-rw-r--r--. 1 root root     0 Oct 12 12:54 1.txt
-rw-r--r--. 1 root root  1576 Oct 12 12:53 2.txt
-rw-------. 1 root root  3332 Oct 1 01:28 anaconda-ks.cfg
-rw-r--r--. 1 root root 40356 Oct  1 01:28 install.log
-rw-r--r--. 1 root root  9154 Oct 1 01:27 install.log.syslog

\ :脱意符号(变为普通无意义的字符)。

[root@localhost ~]# cat 11.txt\*
cat: 11.txt*: No such file or directory


|:管道符(前面已经总结)。

$: 变量前的标识符或者和结合用(前面一节已经总结)。

;:执行两个以上命令的分隔符。

[root@localhost ~]# ls 11.txt;cat 11.txt
11.txt
aaa
aaa

:特殊符号。家目录:/root;普通用户:/home/usname

[root@localhost ~]# cd ~  #家目录
[root@localhost ~]# pwd
/root
[root@localhost ~]# su chensenlin   #普通用户:陈森林
[chensenlin@localhost root]$ pwd
/root
[chensenlin@localhost root]$

$ :如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。

[chensenlin@localhost root]$ sleep 30 &
[1] 3394
[chensenlin@localhost root]$ jobs
[1]+ Running                 sleep 30&

[] :中间字符任意一个。

[root@localhost ~]# ls -d chen[1-3]
chen1 chen2  chen3

  【cut 命令-截取】

语法:cut   -d  ’分隔字符‘  dfc 数字

-d:后面指定分隔符,需要加单引号;

-f :指定第几段;

-c 后面只有一个数字表示截取第几个字符,后面跟一个数字区域,表示截取从几到几。

[root@localhost ~]# cat 11.txt | cut -d ‘;‘ -f 1|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

  【sort命令-排序】

语法:  sort  -t 分隔符   [-kn1,n2]  [-nru]

-t 分隔符:后面指定分隔符,需要加单引号;
-n
:使用纯数字排序;
-r
:反向排序;
-u
:去重复。

[root@localhost ~]# head -n5 11.txt   #如果 sort 不加任何选项,则从首字符向后,依次按 ASCII 码值进行比较,最后将他们按升序输出.
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# head -n5 11.txt|sort -t: -k3,5 -r
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

-k3,5 表示从第 3 到第 5 区域间的字符串排序,-r 表示反向排序。

  【wc命令-统计】

wc :统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。

-c 统计字节数;
-l
统计行数;
-m
统计字符数。这个标志不能与 -c 标志一起使用;
-w
统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串;
-L
打印最长行的长度。

[root@localhost ~]# wc -l 11.txt
31 11.txt
[root@localhost ~]# wc -m 11.txt
1445 11.txt
[root@localhost ~]# wc -w 11.txt
46 11.txt
[root@localhost ~]# wc -L 11.txt
79 11.txt
[root@localhost ~]# wc -c 11.txt
1445 11.txt

  【uniq tee 命令】

[root@localhost ~]# sort 1.txt|uniq
11
111
1111
11111
2222
333
3333
33333
4444
5
666
777
[root@localhost ~]# sort 1.txt|uniq -c
     10 11
     10 111
     10 1111
      1 11111
      1 2222
     20 333
     10 3333
      1 33333
      1 4444
     10 5
      9 666
     10 777

 tee 命令,后跟文件名,类似与重定向’>’,但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上。

[root@localhost ~]# echo "qwqwqwqwqw"|tee1.txt
qwqwqwqwqw
[root@localhost ~]# cat  1.txt
qwqwqwqwqw

  【 tr split 命令】

tr :替换字符(特殊字符);也可大小写转换。

-d :删除字符;

-s:去重复。

[root@localhost ~]# head -n3  cat 1.txt |tr a-z A-Z
head: cannot open `cat‘ for reading: No such file ordirectory
==> 1.TXT <==
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN

split 用于切割文档。

-b:依照大小切割。单位为byte

-l:行数切割;

[root@localhost ~]# mkdir split_dir
[root@localhost ~]# cd !$
cd split_dir
[root@localhost split_dir]# cp /etc/passwd ./
[root@localhost split_dir]# split -b500 passwd
[root@localhost split_dir]# ls
passwd  xaa  xab xac
[root@localhost split_dir]#

  【shell 中连接符(并且、和、或者)

在上面刚刚提到了分号,用于多条命令间的分隔符。另外还有两个可以用于多条命令中间的特殊符号,
那就是 &||,下面把这几种情况全列出:
(1) command1 ; command2
(2) command1 && command2
(3) command1 || command2
使用  ;  时,不管command1 是否执行成功都会执行command2
使用  &&  时,只有 command1 执行成功后,command2才会执行,否则 command2 不执行。
使用  || 时,command1执行成功后 command2 不执行,否则去执行command2,总之 command1 command2 总有一条命令会执行。

  【grep 过滤】

-c :打印符合要求的行数;
-n
:在输出符合要求的行的同时连同行号一起输出; 
-v
:打印不符合要求的行 
-A
:后跟一个数字(有无空格都可以),例如 –A2 则表示打印符合要求的行以及下面两行; 
-B
:后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行  
-C
:后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行; 
-r :
会把目录下面所有的文件全部遍历;
--color:
把匹配到的关键词用红色标识;

[root@localhost ~]# #grep -n ‘root‘ 1.txt  过滤出带有某个关键字的行并输出行号。
[root@localhost ~]# #grep -n -v ‘root‘ 1.txt  过滤出不带有某个关键字的行并输出行号。
[root@localhost ~]# #grep ‘[0-9]‘ 1.txt   过滤包含数字的行
[root@localhost ~]# #grep -n -v ‘[0-9]‘ 1.txt 过滤出所有包含数字的行并输出行号
[root@localhost ~]# #grep -n -v ‘^#‘ 1.txt 去除所有以‘#‘开头的行
[root@localhost ~]# #grep -v ‘^#‘1.txt|grep -v‘^$‘  去除所有以‘#‘开头的行和空行
[root@localhost ~]# #grep ‘^[a-zA-Z]‘ 1.txt 过滤出以英文字母开头的行
[root@localhost ~]# #grep ‘^[0-9]‘ 1.txt 过滤出以非数字开头的行
[root@localhost ~]# #grep ‘r.o‘1.txt; grep ‘r*t‘1.txt; grep ‘r.*t‘ 1.txt  过滤任意一个或多个字符 
[root@localhost ~]# #grep -A1 ‘root‘ 1.txt 过滤出包含 root 的行以及下面一行
[root@localhost ~]# #grep -B1 ‘root‘ 1.txt 过滤出包含 root 的行以及上面一行
[root@localhost ~]# #grep ‘o\{2\}‘ 1.txt 指定过滤字符次数

.  表示任意一个字符;
*  
表示零个或多个前面的字符;
.*  
表示零个或多个任意字符,空行也包含在内。

  【egrep 命令】

egrep 工具是 grep 工具的扩展,它可以实现所有 grep 的功能,grep -E == egrep

[root@localhost ~]# alias egrep=‘egrep --color‘  #做别名
[root@localhost ~]# #egrep ‘o+‘ 1.txt    匹配 1 个或 1 个以上+前面的字符    
[root@localhost ~]# # egrep ‘o?‘ 1.txt    匹配 0 个或者 1 个?前面字符   
[root@localhost ~]# #egrep ‘roo|passwd‘ 1.txt     匹配 roo 或者匹配 passwd 
[root@localhost ~]# # egrep ‘(oo)+‘  1.txt  匹配 1 个或者多个 ‘oo‘;括号表示一个整体

.  表示任意一个字符(包括特殊字符);
*  
表示零个或多个*前面的字符;
.*  
表示任意个任意字符(包含空行);
+  
表示 1 个或多个+前面的字符;
? 表示 0 个或 1 ?前面的字符;
 其中,+? grep 不支持,egrep 才支持。

  【sed 命令】
sed
可以实现 grep 的大部分功能,而且还可以查找替换。

打印指定行

[root@localhost ~]# sed ‘10‘p -n 1.txt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost ~]# sed ‘1,4‘p -n 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


[root@localhost ~]# sed ‘15,$‘p -n 1.txt
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
vcsa:x:69:69:virtual console memoryowner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
pulse:x:498:496:PulseAudio SystemDaemon:/var/run/pulse:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:497:76:Saslauthduser:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separatedSSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
chensenlin:x:500:500:CentOS6.7:/home/chensenlin:/bin/bash

打印包含”root“(某个字符串)的行;

[root@localhost ~]# sed -n ‘/root/‘p 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

特殊符号;

[root@localhost ~]# sed -n ‘/ro.t/‘p 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n ‘/^roo/‘p 1.txt
root:x:0:0:root:/root:/bin/bash

sed 不识别+|{}()等符号,需要借助脱义符号\或者使用选项-r

-e 实现多任务;

[root@localhost ~]# sed -e ‘root/p‘ -e ‘/body/p‘ -n1.txt
nobody:x:99:99:Nobody:/:/sbin/nologin

删除指定的行;

[root@localhost ~]# sed ‘/root/d‘ 1.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

替换的使用:s是替换;g是全局替换;

[root@localhost ~]# sed ‘1.2s/ot/to/g‘ 1.txt

删除所有数字和删除所有非数字;

[root@localhost ~]# #sed ‘s/[0-9]//g‘ 1.txt
[root@localhost ~]# #sed ‘s/[^0-9]//g‘ 1.txt

调换两个字符串位置;

[root@localhost ~]# head -n2 1.txt |sed  -r ‘s/(root)(.*)(bash)/\3\2\1/‘ –

:直接修改文件内容;

[root@localhost ~]# sed -i ‘s/ot/to/g‘ 1.txt

  【awk 命令】

截取文档中的某段 

[root@localhost ~]# awk -F ‘:‘ ‘{print $1}‘ 1.txt

说明: -F 指定分隔符号为 :  

也可以使用自定义字符连接每个段 

[root@localhost ~]# awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ 1.txt

或者使用 awk 内部变量 OFS,格式如下: 

# awk -F ‘:‘ ‘{OFS="#"} {print $1,$2,$3,$4}‘ 1.txt

匹配字符或字符串 

[root@localhost ~]# awk ‘/oo/‘ 1.txt

针对某个段匹配 

[root@localhost ~]# awk -F ‘:‘ ‘$1 ~/oo/‘ 1.txt

多次匹配 

[root@localhost ~]# awk -F ‘:‘ ‘/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/‘ 1.txt

条件操作符==, >,<,!=,>=;<=   

第三段为 0 

[root@localhost ~]# awk -F ‘:‘ ‘$3=="0"‘  1.txt;

第三段大于等于 500 

[root@localhost ~]# awk -F ‘:‘ ‘$3>=500‘ 1.txt;

说明:当比较数字时,不能加双引号,如果写成$3>="500"就不符合我们的需求了。  

第七段不是‘/sbin/nologin‘ 

[root@localhost ~]# awk -F ‘:‘ ‘$7!="/sbin/nologin"‘  1.txt;

第三段小于第四段 

[root@localhost ~]# awk -F ‘:‘ ‘$3<$4‘ 1.txt ;

第三段大于 5,并且第三段小于 7 

[root@localhost ~]# awk -F ‘:‘ ‘$3>5 && $3<7‘ 1.txt

第三段大于 5 或者第七段为‘/bin/bash‘ 

[root@localhost ~]# awk -F ‘:‘ ‘$3>"5" || $7=="/bin/bash"‘ 1.txt

awk 内置变量 NF(段数)  NR(行数) 

[root@localhost ~]# head -n3 1.txt | awk -F ‘:‘ ‘{print NF}‘  
[root@localhost ~]# head -n3 1.txt | awk -F ‘:‘ ‘{print $NF}‘  
[root@localhost ~]# head -n3 1.txt | awk -F ‘:‘ ‘{print NR}‘

打印 20 行以后的行 

[root@localhost ~]# awk ‘NR>20‘ 1.txt

打印 20 行以后并且第一段包含‘ssh‘的行 

[root@localhost ~]# awk -F ‘:‘ ‘NR>20 && $1 ~ /ssh/‘  1.txt

更改某个段的值 

[root@localhost ~]# awk -F ‘:‘ ‘$1="root"‘ 1.txt

数学计算, 把第三段和第四段值相加,并赋予第七段 

[root@localhost ~]# awk -F ‘:‘ ‘{$7=$3+$4; print $0}‘ 1.txt

但是这样的话,相当于改变了原来文本的结构,所以 print $0 的时候就不再有分隔符显示。如果想显

示分隔符需要借助 OFS 

[root@localhost ~]# awk -F ‘:‘ ‘{OFS=":"} {$7=$3+$4; print $0}‘ 1.txt

计算第三段的总和 

[root@localhost ~]# awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ 1.txt

awk 中也可以使用 if 关键词 

[root@localhost ~]# awk -F ‘:‘ ‘{if ($1=="root") print $0}‘ 1.txt

!!总结完毕。


本文出自 “SenLinux” 博客,谢绝转载!

《shell编程入门》学习总结

标签:shell编程入门;linux运维;学习总结

原文地址:http://chensenlin.blog.51cto.com/10559465/1706057

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!