感谢支持
我们一直在努力

Linux的变量I/O重定向管道全局搜索正则表达式

linux中的变量

变量的分类:


本地变量:只对当前用户的shell有用


声明方法:变量名(大写)= “xxxxx” ’ xxxxx’


环境变量:对当前用户写的shell和子shell都有效


       声明方法:export 变量名(大写)= “xxxxx” ’ xxxxx’


查看环境变量:


[root@www.linuxidc.com tmp]# export


DISPLAY:定义是哪个主机,第几个屏幕显示


HISTSIZE:定义history中存取历史记录的条数


HOME:当前用户的家目录


PATH:执行外部命令(非当前shell自带的命令)就在PATH显示的路径中查找


USER:当前用户名


SHELL:当前使用的shell


其他查看环境变量的方法:printevnevn 


变量的引用:


eg


[root@www.linuxidc.com ~]#DIR=’/tmp/script’ 定义变量


[root@www.linuxidc.com ~]#cd $DIR         通过$对变量进行引用


[root@www.linuxidc.com ~]#mkdir $DIR     


[root@www.linuxidc.com ~]#unset DIR        释放变量 


查看变量内容:


将字符输出到显示器使用echo命令


[root@www.linuxidc.com ~]# echo 字符信息


要查看变量中的字符,需要使用  $变量 


[root@www.linuxidc.com ~]# echo $变量   即将变量内字符输出 


特殊变量:$?


$?中的值是上一条命令执行的结果(成功:0,失败1~255


[root@www.linuxidc.com ~]#cd


[root@www.linuxidc.com ~]# echo $?


0


[root@www.linuxidc.com ~]# cdd


-bash: cdd: command not found


[root@www.linuxidc.com ~]# echo $?


127 


位置变量:$1,$2,$3…


作用:将从输入内容导入脚本


eg


脚本:


#/bin/bash


echo $1


echo $2


echo $3


执行脚本:


[root@www.linuxidc.com ~]#脚本名 字符1 字符2 字符3


执行结果:


字符1 字符2 字符3 


算术运算:


linux中默认所有变量都是字符,所以要执行算术运算需加[ ]$(( ))


eg


脚本内容:


#!/bin/bash


echo $[$1+$2]


执行脚本:


[root@www.linuxidc.com ~]#/sum.h 4 5


9 


alias别名的查看与创建:


[root@www.linuxidc.com ~]#alias  直接输入alias显示当前环境中的别名


[root@www.linuxidc.com ~]# alias cdnet=”cd /etc/sysconfig/networking” 给命令创建别名  


[root@www.linuxidc.com ~]# cdnet 输入别名后实现与输入命令相同的作用


[root@www.linuxidc.com networking]#  


[root@www.linuxidc.com ~]#unset cdnet 撤销别名 


无论是直接定义的本地变量还是用export声明的环境变量,在重新登录或reboot之后都会消失。若想对其进行长久保存,需要在相关的配置文件中进行修改。 


相关的配置文档目录:


全局相关:


/etc/profile


/etc/profile.d/*


/etc/bashrc


局部相关(即每个用户有可以设定自己的一套配置)


~/.bash_profile


~/.bashrc 


profile类文件:设置环境变量;


设置某些登陆时就要运行的命令。


bashrc类文件:设置别名;


设置本地变量,和只对当前shell有效的命令。 


shell按照过程和应用次序可以分为:非交互式登陆式的shell和交互式登陆式的shell


非交互式登陆式的shell,启动系统时自动执行。


启动顺序为:~/.bashrc/etc/bashrc/etc/profile.d/*


交互式登陆式的shell,修要登录用户进入系统输入命令。


启动顺序为:/etc/profile/etc/profile.d/*~/.bash_profile/etc/bashrc 


eg:


通过修改配置文件实现用户登录进系统时候,屏幕显示字符串“Helloyou are root(当前用户的用户名)。” 


由于是对于每个用户alluser都有相同的配置,所以应该是全局变量/etc/profile,通过编辑器在文本的最后一行加入“ echo “hello,you are $USER.” ”即可。

输入输出重定向

标准输入 standard input  /dev/stdin   0


标准输出 standard output  /dev/stdout 1


错误输出 standard error   /dev/stderr 2


以上三个文件均为链接文件。分别指向各自对应的标示符。


所谓重定向redirection:就是改变输入/输出的source来源/destination目地。例如本应输出在显示器终端上来的经过输出重定向,将内容输入某个文件;本应由键盘输入的字符信息,经过输入重定向改为由某个文件导入。


             覆盖     追加


输入重定向: <        <<


输出重定向: >        >>


错误重定向: 2>       2>>


 


不论输出正确还是错误都进行重定向:&>


 


eg:


[root@www.linuxidc.com ~]#ls > /tmp/ls.out  #将输出结果从监视器重定向到指定目录下的文档


[root@www.linuxidc.com ~]#lss 2> /tmp/lserr.out  #lss为错误命令,重定向错误提示信息到指定文件


[root@www.linuxidc.com ~]#ls &> /tmp/ignore.out


[root@www.linuxidc.com ~]#lss &> /tmp/ignore.out #不论命令正确与否输出结果都重定向到指定文件


 


>>:用法与>相同,>>为向目的文件中追加新信息,而>则是直接覆盖。


 


注意:&>>是不存在的,若要实现类似的功能,则要遵循特定的指令格式:


[root@www.linuxidc.com ~]#ls >> /tmp/ignore.out 2>> /tmp/ignore.err


#即正确输出重定向到前文件,错误输出重定向到后文件


 


自定义输出重定向:


exec 3~9> 文件 #定义n为自定义的重定向文件


命令输出 >&3 #输出到自定义重定向文件中


自定义重定向输出符:>&


eg


[root@www.linuxidc.com ~]#exec 3> /tmp/ide.out #声明自定义重定向为/tmp/ide.out


[root@www.linuxidc.com ~]#ls >&3 #将输出结果送入自定义重定向文件


作用:在频繁使用重定向输出时,文件会频繁的进行打开关闭,自定义重定向后自定义文件一直处于打开状态,直到撤销。


[root@www.linuxidc.com ~]#exec 3>&-   #输出给 表明撤销


管道

管道由分页符 | 实现,格式为 命令1|命令2|命令3,实现的作用为 将命令1的执行结果送至命令2的参数,执行完成命令2后再将结果送至命令3处供命令3执行,即前一命令的输出作为后一命令的输入。使用管道也可直接向文件导入输出流,即实现输出重定向。


 


eg:


[root@www.linuxidc.com ~]# echo “123456” | passwd hu –stdin


Changing password for user hu.


passwd: all authentication tokens updated successfully.


 


管道分流的实现 tee


命令1的执行结果同时给命令2和命令3


[root@www.linuxidc.com ~]# ls /etc |tee /tmp/lss.out |less


注意:管道向文件导入输出流数据。


 管道和输出重定向本质都是改变输出的方向。


全局搜索正则表达式

[root@www.linuxidc.com ~]# grep 选项 样式 文件目录或文本内容


-i 不区分大小写


-v 与默认动作相反(grep –v “root” 意为查询不包含root的内容)


-n 显示匹配行所在的行号


–color 将匹配字符高亮显示


 


样式


650) this.width=650;” border=0>


 


其中“\<”  “\>”  “\{ , \}”  “\( \) \1” 可理解成以转义字符 \ 反斜杠开头的符号来记忆;“\( \) \1” 括号内字符与普通字符匹配无区别,其只是将括号内容放入寄存器并进行编号,然后用\1(转义的1)进行调用。


 


练习:


1、显示/proc/meminfo文件中以不区分大小的s开头的行;


2、显示/etc/passwd中以nologin结尾的行;


3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;


4、显示/etc/inittab中包含了:一个数字🙁即两个冒号中间一个数字)的行;



5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行

6、显示/etc/inittab文本中以一个数字开头并以一个与开头数字相同的数字结尾的行;
7ifconfig命令可以显示当前主机的IP地址相关的信息等,如果使用grep等文件处理命令取出本机的各IP地址,要求不包括127.0.0.1

8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行; 


1.[root@www.linuxidc.com tmp]# grep –color ^[sS] /proc/meminfo


SwapCached:          0 kB


SwapTotal:      522104 kB


SwapFree:       522104 kB


Slab:            34588 kB


 


2.[root@www.linuxidc.com tmp]# grep –color “nologin$” /etc/passwd


 


3.[root@www.linuxidc.com tmp]# grep –color ^\#” “*.* /etc/inittab


 


4.[root@www.linuxidc.com tmp]# grep –color :[0-9]: /etc/inittab


[root@www.linuxidc.com tmp]# grep –color “:[[:digit:]]:” /etc/inittab



5. [root@www.linuxidc.com tmp]# grep “^[[:space:]]\{1,\}” /boot/grub/grub.conf


6. [root@www.linuxidc.com tmp]# grep –color “^\([[:digit:]]\).*\1$” /etc/inittab


7. [root@www.linuxidc.com tmp]# ifconfig | grep “inet add” | grep -v “127.0.0.1”| cut -d”:” -f2 | cut -d” ” -f1


8.[root@www.linuxidc.com tmp]#grep –color “[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}” /etc/sysconfig/network-scripts/ifcfg-eth0 

命令的连接

命令1 && 命令2


当命令1成功执行,才会继续执行命令2


命令1  | | 命令2


当命令1执行失败,才会执行命令2


具体实例见最后的shell script


 


Shell Script练习

与今天shell script相关的命令:


 


文本截取命令cut


[root@www.linuxidc.com ~]# cut 选项 文档


-d 定义分隔符(由定义分隔符将文本分成若干的段)


-f num 定义截取第几段(-f1,2,3,5可同时截取多个段)


 


ping命令:


[root@www.linuxidc.com ~]# ping 选项 ip地址


-c 设置ping向目的ip的次数


-W设置超时等待时间


写一个脚本


创建用户test1~10,将密码设置为用户名。


 


 


#!/bin/bash


#


for I in `seq 1 10`;do


        useradd “test$I”


        echo “test$I” | passwd “test$I” –stdin


done


 

写一个脚本
1、设定变量FILE的值为/etc/passwd
2、使用循环读取文件/etc/passwd的第246101315行,并显示其内容;(提示:LINE=`head -2 /etc/passwd | tail -1`可以取得第2行)
3、把这些行保存至/tmp/mypasswd文件中

#!/bin/bash


FILE=’/etc/passwd’


for I in 2 4 6 13 15;do


        LINE=`head -$I $FILE | tail -1`


        echo “$LINE”


echo $LINE>>/tmp/mypasswd


done


 


使用自定义输出重定向:


#!/bin/bash


exec 3>> /tmp/passwd


FILE=’/etc/passwd’


for I in 2 4 6 13 15;do


       LINE=`head -$I $FILE | tail -1`


       echo “$LINE”


echo $LINE >&3


done


exec 3>&-


 

写一个脚本:
1、设定变量FILE的值为/etc/passwd
2、依次向/etc/passwd中的每个用户问好,形如:  (提示:LINES=`wc -l /etc/passwd | cut -d” ” -f1`)Hello, root.
3、统计一共有多少个用户

#!/bin/bash


#


let SUM=0


FILE=’/etc/passwd’


LINE=`wc -l $FILE | cut -d” ” -f1`


for I in `seq 1 $LINE`;do


        NAME=`head -$I $FILE | tail -1 |cut -d: -f1`


        echo hello,$NAME


        SUM=$[$SUM+1]


done


echo $SUM 


注意:此时不用{1..$LINE} 由于head命令对{  }中内容不能读取  

写一个脚本:
添加10个用户user1user10,但要求只有用户不存在的情况下才能添加;
#!/bin/bash
for I in `seq 1 10`;do
        grep “user$I” /etc/passwd &> /dev/null  || useradd user$I
done 
写一个脚本:
通过ping命令测试192.168.0.151192.168.0.254之间的所有主机是否在线,
         如果在线,就显示“ip is up.”
         如果不在线,就显示“ip is down.” 

#!/bin/bash 


for I in {151..254};do


        ping -c1 -W1  192.168.0.$I &> /dev/null  && echo “192.168.0.$I is up.” || echo “192.168.0.$I is down.”


done

赞(0) 打赏
转载请注明出处:服务器评测 » Linux的变量I/O重定向管道全局搜索正则表达式
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏