Shell编程笔记

Shell编程笔记

1.基础概述

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。

Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来解释执行程序,如果熟练掌握Shell脚本,可以让我们操作计算机变得更加轻松,也会节省很多时间。

Shell不是具体哪一款程序,是一类程序的统称,这些程序只要是能够按照用户的要求去调用操作系统的接口,就可以称之为Shell程序.

linux发展至今,有许多shell程序,其中一款软件叫做bash
系统提供 shell命令解析器: sh ash bash
查看自己linux系统的默认解析:echo $SHELL
Shell编程笔记_第1张图片
shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装shell命令解释器的环境下执行

拓展:

脚本的调用形式:

(1)打开终端时系统自动调用:/etc/profile~/.bashrc
/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置开始自启动的程序,一般也在这里设置。
~/.bashrc
用户自己的家目录中的.bashrc
登录时会自动调用,打开任意终端时也会自动调用,这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等。
(2)用户手动调用:用户实现的脚本

脚本三种执行方式:

(1)./xxx.sh :先按照 文件中#!指定的解析器解析
如果#!指定指定的解析器不存在 才会使用系统默认的解析器

(2)bash xxx.sh:指明先用bash解析器解析
如果bash不存在 才会使用默认解析器

(3). xxx.sh 直接使用默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的

1.1 基础命令
1.1.2 找出登录人员:who命令
#获取当前已登录系统中的所有用户的信息
#当用户登录熊同事,UNIX系统会为用户所在终端或网络设备分配一个唯一的标识数字,这个数字就是tty编号
who
1.1.3 回显字符:echo命令

echo命令会在终端打印出(或者说回显)你在行中输入的所有内容,且echo会将单词间多余的空白字符压缩,通常会忽略多余的空白字符。

echo this is test
echo ?		#打印出一个字母的文件
echo a? 	#打印出以a开头的两个字母
echo ??		#打印出两个字母的文件
echo ??*  	#打印出两个字母以上的所有文件
echo *		#使用文件名替换,列出所有文件
1.2 使用文件

UNIX系统只识别三种基本类型的文件:普通文件、目录文件和特殊文件。

1.2.3 统计文件中单词数量:wc命令

wc命令可以获得文件中的行数、单词数和字符数。需要将待统计的文件名作为该命令的参数。

// 命令
wc [参数] [文件名]
    
// 命令选项(参数)
l 统计文件包含的行数
c 统计文件中包含的字符数
w 统计文件中包含的单词数
1.3.1 主目录和路径名

按照惯例,【…】指向当前目录的上一级目录,也称为父目录。

另一种惯用写法是单点号【.】,他总是引用当前目录。

1.4.1 星号

Shell有一个强大的特性:文件名的替换。Shell会自动将模式【*】替换成当前目录下能够匹配到的所有文件名。

1.4.2 匹配单个字符

星号(*)能够匹配零个或多个字符,也就是说,x星能够匹配文件x,也能够匹配x1、x2、xabc等。问号(?)仅能匹配单个字符。

破折号(-)指定一个字符的逻辑范围。例如,[0-9]能够匹配字符0~9。在指定字符范围的时候,唯一的限制就是第一个字符在字母表上的必须位于最后一个字符之前。

1.5.1 文件名中的空格

有两种解决办法:使用反斜杠将所有空格进行转义,或者将整个文件名放在引号中,让Shell指导这是一个包含了空格的单词,并非多个单词。

例:

cat "my test document"

cat "my\test\document"
1.6 标准输入/输出和I/O重定向
1.6.1 标准输入和标准输出

UNIX命令可以使用文件或上一条命令的输出作为其输入,也可以将其输出发送给另一条命令或其它程序。这个概念极其重要。

Ctrl+d,表示数据输入完毕。

1.6.2 输出重定向

将发送到标准输出的命令输出转移到文件中,即叫做输出重定向。

如果将【>file】放置在能够将输出写入到标准输出上的命令之后,那么该命令的输出就会被写入到文件【file】中:

#使who的输出结果被写入到文件users中
who > users

注意:这个不会有任何输出内容出现,因为输出已经从默认的标准输出设备(终端)重定向到了指定文件中。

如果命令的输出被重定向到某个文件,而这个文件中之前已经有了内容存在,那么这个已有的内容会被重写。

当使用字符【>>】时表示另一种类型的输出重定向。这组字符使得命令的标准输出内容被追加到指定文件的现有内容之后,文件中先前的内容并不会丢失,新的输出只不过被添加到尾部而已。

例:

#将file1的内容追加到file2之后
cat file1 >> file2
1.6.3 输入重定向

正如命令的输出可以被重定向到文件中,文件也可以被重定向命令的输入中。小于号【<】则被作为输入重定向符号。只有哪些从标准输入中接收输入的指令擦能够使用这种方法将文件重定向到其输入中。

1.7 管道
1.7.1 管道

UNIX能够将两个命令“连接”在一起,这种连接叫做管道,它可以将一个命令的输出直接作为另一个命令的输入。

管道使用字符【|】表示,被放置在两个命令之间。例如,在【who】和【wc -l】之间创建一个管道,可以输入:

who | wc -l

管道可以在任意两个程序间创建,前提是第一个程序会将输出写入到标准输出,第二个程序会从标准输入中读取输入。

1.7.1 过滤器

可以从标准输入中接收输入,对输入数据进行处理,然后将结果写入标准输出。总的来说就是用来在管道中修改其他程序输出的程序。

cat、sort都可以作为过滤器。

ls、who、date、cd、pwd、echo、rm、mv、及cp并没有从标准输入中读取输入,不是过滤器。

1.9.1 在一行中输入多个命令

如果在一行中输入多个命令,只需要使用分号作为命令之间的分隔符就行。

1.9.3 ps命令

ps命令能够给出系统中所运行的进程信息。

如果配合【-f】选项,ps会打印出更多的进程信息,包括父进程ID(PPID)、进程开始时间(STIME)及其他命令参数。

2.什么是Shell

#!/bin/bash: 是指此脚本使用/bin/bash来解释执行。其中,#!是一个特殊的表示符,后面紧跟着解释此脚本的shell路径。bash只是shell的一种,还有很多其它shell,比如:sh,csh,ksh,tcsh等等。

#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。

2.1 内核和实用工具

UNIX系统在逻辑上被划分为两个不同的部分:内核和实用工具(Utility),通常来说,所有访问都要经由Shell,Shell是一个实用工具程序,它作为登录过程的一部分被载入到内存中执行。

2.3 在Shell中输入命令

重要的要认识到Shell是一个程序,在系统中没有什么特权。

2.4 Shell的职责

(1)程序执行

(2)变量及文件明替换

(3)I/O重定向

(4)管道

(5)环境控制

(6)解释型编程语言

3.常备工具

3.1 正则表达式

正则表达式给出了一种便捷、一致的方式来指定待匹配的模式。

Shell认为【?】能够匹配任意单个字符,而在正则表达式中(regular expression,通常简写为regex)则是使用点号(.)来实现相同的效果。

3.1.1 匹配任意字符:点号(.)
正则表达式
r.	#可以匹配r以及任意单个字符
正则表达式
.x.	#可以匹配由任意两个字符包围的x,这两个字符不必相同
正则表达式:查找功能
/ ... /	

注:编辑器ed是一个旧式的行编辑器,一直存在与Linux中

ed命令正则表达式测试:

ed temp.txt	#使用ed编辑器打开文件,然后终端后会打印出文件中总的字符数

1,$p		#打印出全部行,【p】为打印命令,【$】为范围限定符,
    		#最基本的范围限定符就是1,$,这表示从文件的第一行到最后一行
    
/ ... /		#表示查找由空格包围的3个字符
/			#表示重复最后一次查询(继续搜索)  

1,$s/p.o/XXX/g	#将所有的p.o修改成XXX,【s】为替换命令,【g】表示执行全局替换
3.1.2 匹配行首:脱字符(^)

脱字符^作为正则表达式的第一个字符,用来匹配行首位置

/the/	#表示查找the
/^the/	#表示查找以the开头的行

1,$s/^/>>/		#在每一行的行首插入>>
1,$s/^/    /	#在每一行的行首插入4个空格

3.1.3 匹配行尾:美元符号($)

点号可以匹配任意字符,因此正则表达式【$】匹配的是行尾的任意字符(包括点号)。

如何匹配点号?一般而言,如果你想匹配任何对于正则表达式来说有特殊含义的字符,可以在该字符前加一个反斜杠(\)来去除其特殊含义。

\.$		#匹配以点号结尾的行
    
^\.		#匹配以点号开头的行
     	#将反斜线作为普通字符,可以使用连续两个反斜线【\\】
    
/\.$/		#搜索以点号结尾的行   
    
1,$s/..$//	#删除每行最后的两个字符
    
^$		#匹配空行
^ $		#匹配由单个空格组成的行
    
3.1.4 匹配字符组:【…】
[tT]he	#匹配小写或大写的t,然后是字符the
/[tT]he/	#查找the或The

1,$s/aeiouAEIOU//g	#所有的元音字母

#可以在中括号内使用字符范围来表示,具体的写法师使用连接符(-)来分隔起始字符与终止字符
[123456789][0-9]

[A-Z]	#匹配大写字母
[A-Za-z]	#匹配大写或小写字母
/^[A-Z]/	#找出以大写字母起始的行

在ed编辑器中,像*、.、[…]、$和^这类正则表达式序列仅在搜索字符串中有意义,在替换字符串中没有任何特殊含义。

如果脱字符(^)是左中括号后的第一个字符,那么所匹配内容的意义就相反了(相比之下,Shell使用!来实现相同的效果)

[^A-Z]	#匹配除大写字母以外的任意字符
[^A-Za-z]	#匹配任意非字母字符

3.1.5 匹配零个或多个字符:星号(*)

+可用于匹配一次或多次出现在其之前的表达式,因此以下两种表达方式在功能上没有什么不同

XX*	#能够匹配到X以及跟随在其后的零个或多个连续的X
XXX*	#能匹配至少两个连续的X

X+
1,$s/ */ /	#将多个空格修改成单个空格

.*	#常用于指定零个或多个任意字符,记住,正则表达式匹配的是符合模式的最长字符串,因此,匹配的总是整个文本行

正则表达式
1,$s/e.*e/+++/	#将一行中第一个e到最后一个e之间的全部字符(包括首尾的e在内)替换成+++

[A-Za-z][A-Za-z]*	#匹配后面跟着零个或多个字母字符的那些字母字符

[]a-z]	#能够匹配右中括号或小写字母

3.1.6 匹配固定次数的子模式:\{…\}

通用来精确指定需要匹配的字符数量:

\{min,max\}	#min指定了待匹配正则表达式需要出现的最小次数,max指定了要出现的最大次数。
			#并注意,必须使用反斜线对花括号进行转义
X\{1,10\}	#匹配1到10个连续的X

几种特殊情况:

\{10\}	#花括号中只有一个数字,表明此正则表达四必须匹配的次数

.\{10\}	#能够匹配10个任意字符

1,$s/^.\{10\}//	#删除每行的前10个字符
1,$s/.\{5\}$//	#删除每行后5个字符,注意,不是5个字符的,无法满足匹配条件,不做任何修改

#如果花括号中的单个数字后紧跟着一个逗号,则表示之前的正则表达式至少应该匹配的次数
+\{5,\}	#能够至少匹配5个连续加号,
3.1.7 保存已匹配的字符:\(…\)

要想引用已经由正则表达式匹配到的字符,可以将这部分正则表达式放在由反斜线转义过得括号里。这些被捕获到的字符会被保存在由正则表达式解析器预定义好的叫做寄存器的变量中,其编号从1到9。

#能够匹配文本行中的第一个字符并将其保存在寄存器1中
^\(.\)	

#要想检索保存在某个寄存器中的字符,使用 \n (其中n是从1到9的数字)
^\(.\)\1 #首先匹配文本行中的第一个字符并将其保存在寄存器1中,然后匹配保存在寄存器1中的内容(\1指定的)
		 #这个正则表达式的最终效果就是能够匹配一行中头两个相同的字符。

^\(.\).*\1$	#能够匹配行首字符(^.)和行尾字符(\1$)相同的所有的行。首尾字符之间的所有字符有.*匹配

连续出现的\(…\)可以将其匹配的内容分配给后续的多个寄存器。例:

#文本行中的前3个字符会保存在寄存器1中,接下来3个字符会保存在寄存器2中
^\(...\)\(...\)	
#能够匹配到一个长度为12个字符的字符串,其中地1~3个字符和第10~12个字符一样,第4~6个字符和第7~9个字符一样
^\(...\)\(...\)\2\1

在ed中使用替换命令时,寄存器也可以作为替换字符串中的一部分引用。

1,$s/\(.*\)	\(.*\)/\2 \1/	#交换两个字段
3.2 cut

该命令在从数据文件或命令输出中提取(切出)各种字段的时候非常方便。

cut -cchars file

其中,“chars”指定了你想从file中的每行内提取哪些字符(依据位置)包含:
(1)单个数字;如-c5,可以从输入的每行中提取第5个字符

(2)以逗号分隔的数字列表;如,-c1,13,50,可以提取第1个、第13个、第50个字符

(3)连接符分隔的数字范围;如-c20-50,可以提取第20~50个字符

cut -c5- data	#提取从自定位置到行尾的所有字符,并将结果写入标准输出

如果没有指定file,cut会从标准输入中读取输入,这意味着你可以在管道中将cut作为过滤器使用。

可以利用cut从文本行中提取不同位置上的字符,如下:

who | cut -c1-8,18-	#提取第1~8个字符(用户名),然后提取第18个到行尾的字符(登录时间)
# 命令
cut [参数] [文件名]
    
# 命令选项(参数),解决非固定格式数据文件
-d 指定字段分隔符
-f 指定待提取的字段

cut -d: -f1,6 /etc/passwd	#表示提取出以“:”分隔行第一个字段和第6个字段

如果在不使用-d选项的情况下用cut命令从文件中提取字段,则使用制表符作为默认的字段分隔符,而不是空格。

如果字段是由制表符分隔的,可以使用cut的-f选项:

cut -f1 phonebook	#提取文件中的第一个字段

拓展:制表符

制表符即相当于键盘上的 Tab键(Q的左方,Caps lock的上方)
在格式控制输出中用“\t”表示
相当于回车在printf中用“\n”表示

通常用于将输出对齐

如何知道字段是有空格还是由制表符分隔的?

(1)试错法

(2)命令:

sed -n 1 file

如果字段是由制表符分隔的,在制表符的位置上显示:\t

3.3 paste

paste 命令的效果和cut相反;它不是拆分行,而是合并行。该命令的一般格式为:

paste files

由files指定的每个文件中对应的行被“粘贴”或合并在一起,形成一行,然后写入到标准文件中(两者之间由制表符分隔)。连接符“-”可以用在files中,将输入源指定为标准输入。

# 命令
paste [参数] [列前文件名] [列后文件名]
    
# 命令选项(参数)
-d 指定单个分隔符,该分隔符用来分隔粘贴的所有字段
-s 指定paste只能从同一个文件中粘贴行,不管其他文件,如果指定了单个文件,其效果是将该文件中所有的行合并到一	起,彼此之间用制表符分隔(或者是由-d选项指定的分隔符)

例:
paste -d'+' names address numbers	#将分隔符放在单引号中总是最安全的办法

paste -s names	#粘贴names文件中的所有行

ls | paste -d' ' -s -	#粘贴ls命令的输入,使用空格作为分隔符

3.4 sed

sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按文本内容,灵活方便,特别适合于大文件的编辑。

sed可以用来在管道或命令序列中编辑数据。它是stream editor(流编辑器)的简称。和ed不同,sed并非交互式程序。sed会将指定的命令应用在输入的每一行上,并将结果写入到标准输出。sed的一般用法:

sed -e 's/wang/w/g;s/xu/x/g' user.txt	#sed -e 是可以在一行里执行多条命令 
										#'s/wang/w/g;s/xu/x/g'的意思,s代表search,
										#g是尽可能多的匹配,有多少替换多少,
										#因而意思是将user.text文本中的wang 替换成w,xu 替换成x

要养成将sed命令放入单引号的习惯。

sed不会修改原始输入文件。要想使更改永久生效,必须将sed的输出重定向到临时文件,然后使用该临时文件替换掉原文件:

sed -e 's/Unix/UNIX/g' intro > temp	#做出修改
mv temp intro						#是修改永久生效

在sed命令中利用正则表达式删除从一个空格(标记了用户名的结束)到本行末尾的所有字符:

who | sed 's/ .*$//'

sed命令使用空(nothing)(//)降低一个空格到本行末尾的所有字符(.*$)全部替换掉。也就是说,删除了每行中第一个空格之后的所有字符。

# 命令
sed [参数] [模式] [文件名]
    
# 命令选项(参数)
-e 是可以在一行里执行多条命令
-n 指定提取特定的行
-d 删除文本行

例:

sed -n '1,2p' intro	#只打印前两行

#使用sed显示包含指定字符串的行
sed -n '/UNIX/p' intro	#只打印出包含UNIX行

sed默认会将所有的输入行写入标准输出,如果在d命令前加上模式,就可以使用sed删除素有符合模式的的行。

例:

sed '1,2p' intro	#删除行1和行2

sed '/UNIX/d' intro	#删除所有包含UNIX的行
3.5 tr

过滤器tr可用于转换标准输入中的字符。该命令的一般形式为:

tr from-chars to-chars

其中,from-chars和to-chars可以是一个或多个字符。也可以是字符组。

# 命令
tr [参数] [字符1] [字符2]
    
# 命令选项(参数)
-s "压缩"to-chars中多次连续出现的字符
-d 删除输入流中的个别字符

例:

tr e x <intro	#将所有的字符e转换成x

注意:必须将文件intro重定向到tr的输入中,因为tr要从标准输入中获得输入。转换结果被写入标准输出,不会改动原始文件。

可以把tr命令放在管道的末尾,通过将冒号转换成制表符,从而生成可读性更好的输出结果:

cut -d: -f1,6 /etc/passwd | tr : '	'

单引号中的是制表符。必须将其放在引号中,以避免在解析命令行时被Shell当做是多余的空白字符丢弃。

若处理不可打印字符,也可在tr中使用字符的八进制描述形式:

tr'\11'	#将冒号转换成制表符

date | tr ' ' '\12'	#将空格转换成换行符

tr '[a-zA-Z]' '[A-Za-z]'	#将大写字母转换成小写字母,将小写字母转换成大写字母
tr -s ':' '\11'	#将所有磨耗转换成制表符,使用单个制表符替换多个制表符

也可以使用tr中的-s选项来压缩多个空格,只需要将单个空格字符作为第一个和第二个参数即可:

tr -s ' ' ' ' ' ' < lotsaspaces	#使用空格来转换多个空格,也就是将输出中的多个空格替换成单个空格

tr也可用于删除输入流中的个别字符,其用法:

tr -d form-chars

例:

tr -d ' ' < intro	#删除文件intro中的所有空格

注意:tr只能够处理单个字符,如果你需要转换的字符不止一个,就只能借助其他程序,如sed。

3.6 grep

grep能够在一个或多个文件搜索指定的模式,该命令的一般格式为:

grep pattern files

每个文件中匹配模式的行都会显示在终端中。如果grep中的命令中指定了不止一个文件,文件名会出现在每一行之前,以便于识别模式所对应的文件。

#在文件ed.cmd中查找素有单词shell
#如果指定的模式不存在于指定文件中,grep命令什么都不显示
grep shell ed.cmd

#grep命令在当前目录的所有文件中搜索单词shell
grep shell *

和sed中的表达式以及tr中的模式一样,最好是把grep中的模式放在单引号之中,避免shell误解。

#Shell发现了命令行中的星号,自动将其替换成当前目录下的所有文件名
grep * stars

#将星号放在引号中就可以避免Shell对其进行解析和解释
grep '*' stars
3.6.1 正则表达式与grep
#搜索以小写t或者大写T开头,然后搜是he的字符串
grep '[tT]' intro

#也可以用grep的-i选项,该选项可以忽略模式中的大小写
grep -i 'the' intro
3.6.2 grep 命令选项
# 命令
grep [参数] [模式] [文件]
    
# 命令选项(参数)
-i 忽略模式中的大小写
-v 不匹配指定模式的行
-l 输出匹配模式的那些行所在文件的文件名
-n 文件中匹配指定模式的每一行前面会加上对应的行号
#eg

grep -v 'UNIX' intro	#打印不包含UNIX的行

grep -l 'Move_history'	*.c	#列出包含Move_history的文件

grep -n 'Move_history' testch.c	#在匹配的行前加上行号
3.7 sort

sort基础的功能就是:给出输入,他会将其按照字母顺序排序并输出排序结果。默认情况下,sort会提取指定输入文件中的每一行,按照升序排列。特殊字符会根据其内部编码来排序。例如,空格在内部是用数字32描述的,双引号是用数字34描述的,这意味着前者会排在后者之前。

3.7.1 sort命令选项
# 命令
sort [参数] [文件]
    
# 命令选项(参数)
-u 消除输出中重复的行
-r 可以实现逆序排列
-o 将排序结果放在文件中
-n 指定将行中的第一个字段视为数字,对应的数据进行算术排序
-k2n 表示跳过每一行的第一个字段,从第二个字段开始排序。与此类似,-k5n表示对每行的第5个字段进行算术排序
-t 如果跳过了某些字段,sort则假定这些字段之间是以空格或者制表符分隔的。使用-t,其后的字符会被视为分隔符
#eg

sort -u names	#消除文件中的重复行
sort | uniq		#消除文件中的重复行

sort -r names	#逆序

sort names > sorted_names	#将排序结果不写进标准输出,而是放进文件中
sort names -o sorted_names	#将排序结果不写进标准输出,而是放进文件中

sort -n data	#算术排序

sort -k2n data	#从第二个字段开始排序(字段间默认使用空格或制表符分隔的)

sort -k3n -t: /etc/passwd	#对第3个以冒号分隔的字段(用户ID)进行算术排序

3.8 uniq

uniq命令可用于查找或者删除文件中的重复行。

该命令的基本格式:

# 命令
uniq [in_file] [out_file]
    
# 命令选项(参数)
-d 找出文件中重复的内容
-c 统计出出现的次数

其中,uniq将in_file复制为out_file,同事删除所有重复的行,uniq将重复的行定义为内容一模一样的连续行。

如果没有指定out_file,则结果会写入标准输出。如果in_file也没有指定,那么uniq可以作为过滤器,从标准输入中去读取内容。

sort常用于将重复的行调整到一起并将sort排序后的结果再交给uniq:

sort names |uniq
sort names | uniq -d	#列出重复行
sort /etc/passwd | uniq -d	#找出/etc/passwd中重复的条目

uniq的-c选项可以统计出现的次数,在脚本中极为有用:

sort names | uniq -c	#统计行出现的次数

uniq -c的一个常见的用法是找出数据文件中词频最高的单词,可以通过下面的命令行实现:

tr '[A-Z]' '[a-z]' datafile | sort | uniq-c | head
3.9 awk拓展了解

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}

# 命令
awk [选项]  '指令'  操作文件
    
# 命令选项(参数)
-v 定义变量
-f 调用脚本
-F 指定分隔符

调用awk
(1)将所有的awk命令插入一个单独文件,然后调用:

awk -f awk-script-file input-file(s)

其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

(2)命令行方式

awk [-F field-separator] ‘commands’ input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

(3)shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk

3.10 perl拓展了解

perl 语言是用于文本处理语言,它代表实用提取和报告语言,可在各种平台运行(windows unix等)

perl借用了C、sed、awk、shell脚本以及很多其他编程语言的特性,语法与这些语言有些类似,也有自己的特点。

Perl 程序有声明与语句组成,程序自上而下执行,包含了循环,条件控制,每个语句以分号 ( ; ) 结束。

3.10.1 perl 基础语法

perl 代码可以写在一个文本文件中,以 .pl、.PL 作为后缀

perl 注释的方法为在语句的开头用字符 #

perl 输出字符串可以使用单引号和双引号

3.10.2 Perl 数据类型

标量, 开 头 , 开头, myfirst=123;

数组,@开头,@arr=(1,2,3)

哈希,%开头,类似python的字典,有key和value,%h=(‘a’=>1,‘b’=>2);

3.10.3 函数

定义函数:sub 开头,大括号包含函数体

sub subroutine{
statements;
}

调用子程序语法格式:

subroutine( 参数列表 );
3.10.4 特殊:@_ 表示所有的参数

特有命令:

push:从数组的末尾加入元素。

pop :从数组的末尾取出元素

shift: 从数组的开头取出元素

unshift:从数组的开头加入元素

4 变量

4.1 定义变量
变量名=变量值
4.2 变量操作
#引用变量
$变量名
#清除变量值
unset :变量
#从键盘获取值read
read 变量

#在一行上显示和添加提示 需要加上-p
read -p "请输入num的值:" num

#只读变量
readonly num=10
#查看环境变量
env
4.2.1 双引号 单引号的区别

双引号:可以解析变量的值
单引号:不能解析变量的值

num=200
echo "num=$num"	#$num当成变量的值处理
echo 'num=$num'	#$num当成字符串处理
4.2.2 PATH变量中 追加一个路径
export PATH=$PATH:/需要添加的路径

例:

#LD_LIBRARY_PATH是Linux环境变量名
#该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。
export LD_LIBRARY_PATH=/mnt/navikit/lib:/mnt/navikit/
4.3 预设变量

shell直接提供无需定义的变量Shell编程笔记_第2张图片

4.4 脚本标量的特殊用法

Shell编程笔记_第3张图片

4.5 变量的拓展
4.5.1 判断变量是否存在
#!/bin/bash
#${num:-val} 如果num存在,整个表达式的值为num,否则为val
echo ${num:-100}	#100
num=200
echo ${num:-100}	#200
4.5.2 字符串的操作
#!/bin/bash
str="hehe:haha:xixi:lala"
#测量字符串的长度 ${#str}
echo "str的长度为:${#str}"	#19

#从下标3为位置提取 ${str:3}
echo ${str:3}	#"e:haha:xixi:lala"

#从下标3为位置提取6个字节 ${str:3:6}
echo ${str:3:6}	#"e:haha"''

#用new替换str中出现的第一个old ${str/old/new}
echo ${str/:/#}	#"hehe#haha:xixi:lala"

#用new替换str中所有的old ${str//old/new}
echo ${str//:/#}	#"hehe#haha#xixi#lala"

5 条件测试

test命令:用于测试字符串、文件状态和数字
test命令有两种格式:

test condition 
或
[ condition ]

使用方括号时,要注意在条件两边加上空格。

5.1 文件测试

Shell编程笔记_第4张图片

5.2 字符串测试

Shell编程笔记_第5张图片

你可能感兴趣的:(嵌入式Linux驱动开发,bash,linux,unix,Shell,正则表达式)