鸟书shell学习笔记(二)shell中正则表达式相关
“mandmass”通过精心收集,向本站投稿了8篇鸟书shell学习笔记(二)shell中正则表达式相关,下面是小编整理后的鸟书shell学习笔记(二)shell中正则表达式相关,欢迎您阅读分享借鉴,希望对您有所帮助。
篇1:鸟书shell学习笔记(二)shell中正则表达式相关
通配符与正则表达式的区别
通配符是bash原生支持的语法,正则表达式是处理字符串的一种表示方式, 正则表达式需要支持的工具支持才可以
语系设置 : export LANG=Cgrep alias 设置 : grep --color=auto
grep 的一些高级参数
grep [-A] [-B] ‘搜寻字符串‘ filename //同时输出之前的k行和之后的m行-A : 后面可加数字,表示列出改行以及之后的n行-B : 列出前面几行
搜寻关键字如果中间使用正则表达式的话,则正则表达式部分需要加上[]eg : grep ‘[a-z]oooo‘ filename
匹配行首 ‘^string‘ 但是 ‘[^s]string‘则表示排除s这个字母匹配行尾 ‘string$‘eg:排除注释行,和空行grep -v ‘^$‘ /etc/profile | grep -v -n ‘^[[:blank:]]*#‘
sed 用法
sed [-nefr] [动作] sed可以直接在文件上进行操作选项与参数:-n :使用安静(silent)模式,
鸟书shell学习笔记(二)shell中正则表达式相关
。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。-e :直接在命令列模式上进行 sed 的动作编辑;-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)-i :直接修改读取的文件内容,而不是由萤幕输出。动作说明: [n1[,n2]]functionn1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』function 有底下这些咚咚:a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);p :列印,亦即将某个选择的数据印出,通常 p 会与参数 sed -n 一起运行~s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!eg: nl regular.txt | sed ‘2,5d‘ //删除第二到第五行 ,sed 后面的动作必须要使用‘‘扩住
nl regular | sed ‘2a add hello‘ 第二行后面增加数据
nl regular | sed ‘2,5c change 2 to 5 line content‘ 替换2-5行的内容
nl regular | sed -n ‘2,5p‘ 选定行打印出来
sed的查找与替换 sed ‘s/要被替换的字符串/新字符串/g‘
cat .bashrc | sed ‘s/#.*$//g‘ | sed ‘s/^$//g‘ |grep -n ‘exp‘ //删除注释行和空白行
sed -i ‘s/\.$/\!/g‘ regular //直接修改文件
awk 好用的数据处理工具适合小型数据处理
awk ‘条件类型1{动作1} 条件类型2{动作2} ...‘ filename
通配符
特殊正则
正则
拓展正则
篇2:linux中Bash shell学习笔记linux操作系统
今天看到一站长写得非常不错的一篇关于Bash shell速成的学习笔记,下面我把文章并整理了一些其它相关的内容,希望给大家带来帮助,
BASH 的基本语法
•最简单的例子 —— Hello World www.111cn.net !
•关于输入、输出和错误输出
•BASH 中对变量的规定(与 C 语言的异同)
•BASH 中的基本流程控制语法
•函数的使用
2.1 最简单的例子 —— Hello World!
几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH。
用 vi 编辑器编辑一个 hello 文件如下:
#!/bin/bash
# This is a very simple example
echo Hello World
这样最简单的一个 BASH 程序就编写完了。这里有几个问题需要说明一下:
一,第一行的 #! 是什么意思
二,第一行的 /bin/bash 又是什么意思
三,第二行是注释吗
四,echo 语句
五,如何执行该程序
#! 是说明 hello 这个文件的类型的,有点类似于 Windows 系统下用不同文件后缀来表示不同文件类型的意思(但不相同)。Linux 系统根据 “#!” 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 “man magic”命令 及 /usr/share/magic 文件来了解这方面的更多内容。在 BASH 中 第一行的 “#!” 及后面的 “/bin/bash” 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下,如果你的 Linux 系统比较特别,bash 也有可能被存放在 /sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或 /usr/local/sbin 这样的目录下;如果还找不到,你可以用 “locate bash” “find / -name bash 2>/dev/null” 或 “whereis bash” 这三个命令找出 bash 所在的位置;如果仍然找不到,那你可能需要自己动手安装一个 BASH 软件包了。
第二行的 www.111cn.net “# This is a ...” 就是 BASH 程序的注释,在 BASH 程序中从“#”号(注意:后面紧接着是“!”号的除外)开始到行尾的多有部分均被看作是程序的注释。的三行的 echo 语句的功能是把 echo 后面的字符串输出到标准输出中去。由于 echo 后跟的是 “Hello World” 这个字符串,因此 “Hello World”这个字串就被显示在控制台终端的屏幕上了。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。
如何执行该程序呢?有两种方法:一种是显式制定 BASH 去执行:
$ bash hello 或
$ sh hello (这里 sh 是指向 bash 的一个链接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh ->bash”)
或者可以先将 hello 文件改为可以执行的文件,然后直接运行它,此时由于 hello 文件第一行的 “#! /bin/bash” 的作用,系统会自动用/bin/bash 程序去解释执行 hello 文件的:
$ chmod u+x hello
$ ./hello
此处没有直接 “$ hello”是因为当前目录不是当前用户可执行文件的默认目录,而将当前目录“.”设为默认目录是一个不安全的设置。
需要注意的是,BASH 程序被执行后,实际上 Linux 系统是另外开设了一个进程来运行的。
2.2 关于输入、输出和错误输出
在字符终端环境中,标准输入/标准输出的概念很好理解。输入即指对一个应用程序 或命令的输入,无论是从键盘输入还是从别的文件输入;输出即指应用程序或命令产生的一些信息;与 Windows 系统下不同的是,Linux 系统下还有一个标准错误输出的概念,这个概念主要是为程序调试和系统维护目的而设置的,错误输出于标准输出分开可以让一些高级的错误信息不干扰正常的输出 信息,从而方便一般用户的使用。
在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示 standard)。在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。
输入、输出及标准错误输出主要用于 I/O 的重定向,就是说需要改变他们的默认设置。先看这个例子:
$ ls >ls_result
$ ls -l >>ls_result
上面这两个命令分别将 ls 命令的结果输出重定向到 ls_result 文件中和追加到 ls_result 文件中,而不是输出到屏幕上,
“>”就是输出(标准输出和标准错误输出)重定向的代表符号,连续两个 “>” 符号,即 “>>” 则表示不清除原来的而追加输出。下面再来看一个稍微复杂的例子:
$ find /home -name lost* 2>err_result
这个命令在 “>” 符号之前多了一个 “2”,“2>” 表示将标准错误输出重定向。由于 /home 目录下有些目录由于权限限制不能访问,因此会产生一些标准错误输出被存放在 err_result 文件中。大家可以设想一下 find /home -name lost* 2>>err_result 命令会产生什么结果?
如果直接执行 find /home -name lost* >all_result ,其结果是只有标准输出被存入 all_result 文件中,要想让标准错误输出和标准输入一样都被存入到文件中,那该怎么办呢?看下面这个例子:
$ find /home -name lost* >all_result 2>& 1
上面这个例子中将首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到 all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。为实现上述功能,还有一种简便的写法如下:
$ find /home -name lost* >& all_result
如果那些出错信息并不重要,下面这个命令可以让你避开众多无用出错信息的干扰:
$ find /home -name lost* 2>/dev/null
同学们回去后还可以再试验一下如下几种重定向方式,看看会出什么结果,为什么?
$ find /home -name lost* >all_result 1>& 2
$ find /home -name lost* 2>all_result 1>& 2
$ find /home -name lost* 2>& 1 >all_result
另外一个非常有用的重定向操作符是 “-”,请看下面这个例子:
$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到 /dest/directory 目录下去,这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。
条件语句(注意:条件里两边的空格,引号,等号)
if [ “$var” = “abc” ]; then
…
elif [ “$var” = “ac” ]; then
…
else
…
fi
for循环
for var in $(ls *.sh); do
echo $var
done
while循环
var=1
while [ “$var” -le 20 ] ; do
var=$(($var+1))
done
until循环(跟while循环相反的)
until condition
do
…
done
case条件(可用正则,;;相当于break)
case “$var” in
yes | YES | y )
echo “YES”
echo “haha”
;;
[Nn]* ) echo “NO”;;
* ) echo “OTHER”;;
esac
定义/赋值变量
var=xxx (等号两边不能有空格)
变量读取
echo $var
读取用户输入
read var
不输出换行
echo -n
执行命令并捕获返回值
$(command)
其它
shell里默认类型是字符串型
发布在编程算法 已有标签 bash, shell. 将该链接存入书签。 Trackbacks are closed, but you can post a comment.
篇3:鸟书shell学习(三)shell脚本程序设计要点总结
首先是读取用户输入的read命令,输出的命令就是echo ,例如:read -p 'please input your first name: ' firstname
echo 'your first name is : $firstname'
shell中变量是没有申明比较随意不需要指定类型,在引用的时候, $变量名 或者是 ${变量名}除了这种方式之外就是通过执行脚本时的参数的传递,在shell中参数名是内置的$0,$1,$2,$4...这里$0表示文件名,$1开始表示第一个参数,其他依次类推. 初次之外还有其他特殊的参数名,如下:
$# : 表示参数个数
$@:代表“$1”,“$2” ... 之意$*:代表“$1 $2 $3 ...” 之意
eg:
#!/bin/bashecho 'filename:'$0echo 'args size: '$#echo 'first arg:'$1
篇4:鸟书shell学习(三)shell脚本程序设计要点总结
shell只能够支持整数的基本运算:+ - * / %
1).declare - i var 可以将变量声明为整数,然后对变量进行运算,变量运算是这样的:$((计算式)) eg:
declare -i v1declare -i v2v3=$(($v1 + $v2))#也可以这样计算:declare -i v3=$v1*$v2 #表达式之间不能有空格
2).var=$((运算内容)) //运算内容中间是允许有空格的 eg:
echo $ (( 19 + 78))
篇5:鸟书shell学习(三)shell脚本程序设计要点总结
循环的几种格式如下:
while do done
while [ condition ]do 程序段done
until do done
until [ condition ]do 程序段done
for...do...done
for var in cond1 cond2 cond3 ...do 程序段donefor ((初始值;限制值;执行步长))do 程序段done
篇6:鸟书shell学习(三)shell脚本程序设计要点总结
shell中可以用test命令进行判断,eg:
test -e ./example.sh #测试文件是否存在
常见测试类型和参数如下:截图来自鸟哥的Linux私房菜
除了可以用test命令进行条件判断之外i,还可以用[] (中括号的语法进行判断,判断测试参数和test一样).
[]语法要求[]内的所有量之间均有空格,eg:
[b“$name”b==b“xiaoyi”b] #b都表示空格
三 复杂脚本
篇7:鸟书shell学习(三)shell脚本程序设计要点总结
if else 的标准格式:
if [ 条件判断1 ] ; then command1elif [ 条件判断2 ] ; then command2else command3fi
其中,条件可以用&&或者||进行连接
case...esac的标准格式如下:
case $variableName in “第一个变量内容”) 程序段 ;; #每个类型的结尾类似break“第二个变量内容”) 程序段 ;; *)# 类似default 用* 代替 其他不符合条件的程序段 ;;esac
篇8:鸟书shell学习(三)shell脚本程序设计要点总结
function fname(){ 程序段}
examples:
#!/bin/bash# if --- else -- exmapledeclare -i v1=10declare -i v2=15if [ $v1 -ge $v2 ] ; thenecho ''$v1' is bigger than '$v2''else echo ''$v1' is smaller than '$v2''fi# case ... esac exampleread -p 'Please input your name : ' namecase $name in“xiaoyi”) echo 'hello xiaoyi' ;;“xiaoyi1”) echo 'hello xiaoyi1' ;;*) echo 'no case matched!' ;;esac# loop exampledeclare lv=1 while [ $lv -le 10 ]do echo $lv lv=$((${lv}+1))doneuntil [ $lv -le 1 ]do echo $lv lv=$((${lv}-1))donefor c in 'c1' 'c2' 'c3'do echo $cdonefor ((i=0;i<10;i=i+1))do echo $idone function printHello(){ echo 'hello'}printHello
【鸟书shell学习笔记(二)shell中正则表达式相关】相关文章:
5.linux中shell 循环处理每天数据linux操作系统
6.Unix Shell 中的流程控制语句Windows系统
10.根鸟读书心笔记






文档为doc格式