老男孩教育每日一题-第60天-一道实用Linux运维问题的9种Shell解答方法!

简介:

2017-06-04

1.问题为:

已知:/etc/hosts的内容为

192.168.1.11  oldboy11.etiantian.org
192.168.1.21  oldboy21.etiantian.org
192.168.1.31  oldboy31.etiantian.org#192.168.1.111  oldboy111.etiantian.org

请用shell脚本实现,怎么才能在输入IP后找到/etc/hosts里对应的唯一的hostname?

2.解答:

法1)脚本过滤法

[root@old_boy scripts]# cat judgehost.sh    
#!/bin/bash   
echo "please input ip address:" 
read ip  
[ -n "`grep "$ip " /etc/hosts`" ] && \  #注意前面的过滤条件结尾带有空格。   
echo "The hostname is: `grep "$ip " /etc/hosts |awk '{print $2}'`" || \  
echo "The ip is invalid"

提示:
1)这是一个grep过滤加条件判断的实现语法:
2)条件判断语法为[ -n "ddd" ] && echo 1 || echo 0
3)[ -n "`grep "$ip " /etc/hosts`" ] && \#注意前面的过滤条件结尾带有空格。这里啊,是为了排除下面的重复情况

192.168.1.11  oldboy11.etiantian.org
192.168.1.111  oldboy111.etiantian.org

------------------我是每种方法分隔符----------------------

法2)脚本精确匹配法:

#!/bin/bash   #author oldboy   #qq 31333741   #judge input   if [ $# -ne 1 ]  
  then 
    echo "input error!" 
    exit 1  fi  
 flag=0  exec < /etc/hosts  
while read line  
do  
 if [ "$1" = "`echo $line|awk '{print $1}'`" ]  
   then 
       flag=1  
       echo "the $1 's hostname is `echo $line|awk '{print $2}'`"   
       break;  
 fi  done   [ $flag -eq 0 ] && echo " sorrry,not find $1 's hostname!"

提示:此题,请大家学习while的用法及设置flag的思路。
执行结果:

[root@old_boy scripts]# sh oldboy.sh 192.168.1.11
the 192.168.1.11 's hostname is oldboy11.etiantian.org 
[root@old_boy scripts]# sh oldboy.sh 192.168.1.21 
the 192.168.1.21 's hostname is oldboy21.etiantian.org
[root@old_boy scripts]# sh oldboy.sh 192.168.1.311
sorrry,not find 192.168.1.311 's hostname!

----------------我是每种方法分隔符---------------
特别提示:下面的方法中,老男孩老师大量的使用了awk的不同方法来实现同样的功能,来告诉大家,awk是很强大的, 希望同学们能按照老师的教学要求精通之。

法3)awk精确匹配:

准备:

[root@old_boy scripts]# tail -4 /etc/hosts192.168.1.11  oldboy11.etiantian.org
192.168.1.111  oldboy111.etiantian.org
192.168.1.21  oldboy21.etiantian.org
192.168.1.31  oldboy31.etiantian.org

脚本:

[root@old_boy scripts]# cat awkhost1.sh   awk 'BEGIN {a="'$1'"} {if($1==a) print $2; }' /etc/hosts

执行结果:

[root@old_boy scripts]# sh awkhost1.sh 192.168.1.21
oldboy21.etiantian.org
[root@old_boy scripts]# sh awkhost1.sh 192.168.1.31
oldboy31.etiantian.org
[root@old_boy scripts]# sh awkhost1.sh 192.168.1.11
oldboy11.etiantian.org

提示:注意a="'$1'"的用法,$1为命令行传参。awk程序中调用系统变量的方法a="'$1'"。
----------------我是每种方法分隔符---------------

法4)awk精确匹配法

[root@old_boy scripts]# cat awkhost2.sh   
awk '{if($1=="'$1'") print $2}' /etc/hosts

执行结果:

[root@old_boy scripts]# awkhost2.sh 192.168.1.11
oldboy11.etiantian.org
[root@old_boy scripts]# awkhost2.sh 192.168.1.21
oldboy21.etiantian.org
[root@old_boy scripts]# awkhost2.sh 192.168.1.311

----------------我是每种方法分隔符---------------

法5)awk过滤法

[root@old_boy scripts]# cat awkhost4.sh   awk '/'"${1} "'/''{print $2}' /etc/hosts

执行结果:  

[root@old_boy scripts]# awkhost4.sh 192.168.1.21  oldboy21.etiantian.org  
[root@old_boy scripts]# awkhost4.sh 192.168.1.11  oldboy11.etiantian.org  
[root@old_boy scripts]# awkhost4.sh 192.168.1.31  oldboy31.etiantian.org

提示:除了语法外,这道题有个学问,就是过滤时传参结尾要带个空格,这样才能过滤重复IP的情况

如:  

 192.168.1.11  oldboy11.etiantian.org  
 192.168.1.111  oldboy111.etiantian.org 
 ```
----------------我是每种方法分隔符---------------
###法6)awk过滤法
```bash
[root@old_boy scripts]# cat awkhost5.sh   
awk '{if($1~/'$1'/) print $2}'  /etc/hosts ##如果文件第一列包含命令行第一个参数字符则打印第二列


执行结果:  

[root@old_boy scripts]# awkhost5.sh 192.168.1.31  oldboy31.etiantian.org  
[root@old_boy scripts]# awkhost5.sh 192.168.1.11  oldboy11.etiantian.org  
oldboy111.etiantian.org ------>这里有bug了。  
[root@old_boy scripts]# awkhost5.sh 192.168.1.21  oldboy21.etiantian.org

改进下来排除bug:  

[root@old_boy scripts]# cat awkhost5-1.sh  
 awk '{if($1~/'$1' /) print $2}'  /etc/hosts ==>用上面加空格的思路不对。  
[root@old_boy scripts]# cat awkhost5-1.sh   
awk '{if($1~/'$1'$/) print $2}'  /etc/hosts #增加一个正则表达式$

执行结果:  

[root@old_boy scripts]# awkhost5-1.sh 192.168.1.21  
oldboy21.etiantian.org  
[root@old_boy scripts]# awkhost5-1.sh 192.168.1.11  
oldboy11.etiantian.org  
[root@old_boy scripts]# awkhost5-1.sh 192.168.1.31  
oldboy31.etiantian.org


----------------我是每种方法分隔符---------------

法7)awk -v精确匹配法

命令行测试:  

[root@old_boy scripts]# awk -v p=192.168.1.21 '$1 == p{print $2}' /etc/hosts  oldboy21.etiantian.org  
[root@old_boy scripts]# awk -v p=192.168.1.11 '$1 == p{print $2}' /etc/hosts  oldboy11.etiantian.org  
[root@old_boy scripts]# awk -v p=192.168.1.11 '$1 == p {print $2}' /etc/hosts  oldboy11.etiantian.org

实际脚本:

[root@old_boy scripts]# cat awkhost6.sh    
#!/bin/bash   
#p=$1   
#awk -v p="$p" '$1 == p{print $2}' /etc/hosts  
awk -v p="$1" '$1 == p{print $2}' /etc/hosts

执行结果:

[root@old_boy scripts]# sh  awkhost6.sh  192.168.1.11
oldboy11.etiantian.org
[root@old_boy scripts]# sh  awkhost6.sh  192.168.1.21
oldboy21.etiantian.org


提示:
1)传参非awk程序,因此写法p="$1"
2)man awk
      -v var=val
      --assign var=val
             Assign the value val to the variable var, before execution of the program begins.   Such  vari-
             able values are available to the BEGIN block of an AWK program.
----------------我是每种方法分隔符---------------

法8:精确匹配简单的写法

[root@old_boy scripts]# cat awkhost9.sh   
awk  '$1 == "'$1'" {print $2}' /etc/hosts

执行结果:  

[root@old_boy scripts]# sh awkhost9.sh  192.168.1.11  
oldboy11.etiantian.org  
[root@old_boy scripts]# sh awkhost9.sh  192.168.1.21  
oldboy21.etiantian.org  
[root@old_boy scripts]# sh awkhost9.sh  192.168.1.31  
oldboy31.etiantian.org


特别提示:这里老男孩老师大量的使用了awk的不同方法来实现同样的功能,很强大吧,

希望同学们能按照老师的教学要求精通之。 
----------------我是每种方法分隔符---------------

法9:学生的一个不成熟的实现法

#!/bin/bash   b=/$PWD/wang.txt  
echo -n "plase input ip : " read a  
if [ $a == "192.168.1.11" ]  
        then cat $b | grep $a | awk -F ' ' '{print $2}' 
 elif [ $a  == "192.168.1.21" ]   
        then cat $b | grep $a | awk -F ' ' '{print $2}' 
 elif [ $a  == "192.168.1.31" ]  
        then cat $b | grep $a | awk -F ' ' '{print $2}' 
        else echo "plase input the correct IP address " && exit 1  fi

提示:大家看看问题在哪?脚本不通用。  

----------老男孩老师改进后

#!/bin/bash   
#author oldboy   
#qq 31333741   
hosts_file="$PWD/oldboy.txt" 
#judge file  
 [ ! -f $hosts_file ] && echo "no test file!" && exit 1  
 echo -n "plase input ip : " 
 read ip  
#judge ip format   
[ "${#a}" -lt 8 ] && [ "`echo $ip|sed 's/[0-9]//g'`" != "..." ] && \  
echo "Plase input the correct IP address" && exit 1  
#start  
 result1=$(grep "$ip" $hosts_file|awk '{print $1}')  
 if [ "$ip" == "$result1" ]  
 then   
        grep "$ip" $hosts_file|awk '{print $2}' 
        exit 0  else 
        echo  "Not find the hostname of $ip" 
        exit 1  
 fi

提示:此法不可取,画蛇添足了。


本文转自 李导 51CTO博客,原文链接:http://blog.51cto.com/lidao/1932142

相关文章
|
5月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
4月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
510 9
|
4月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
4月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
471 2
|
5月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1815 10
|
6月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
838 0
|
5月前
|
Ubuntu Linux 图形学
推广与体验Ubuntu Linux的便捷方法
如果你的朋友或家人对尝试Linux感兴趣,但希望在安装之前先体验一下,你可以分享以下链接给他们:Ubuntu在线导览。通过这个链接,他们可以在任何地方轻松体验Ubuntu,无需安装即可深入了解这个流行的操作系统。
|
5月前
|
XML 缓存 Linux
在Linux环境下解决Visual Studio Code字体显示异常和字体替换方法。
解决Linux下VS Code字体显示异常,需要对Linux字体渲染机制有所理解,并对VS Code的配置选项进行合理设置。替换字体时则要通过系统字体配置或VS Code设置来完成。通过上述方法,可以有效地解决字体显示问题,从而提升代码编辑的视觉体验。
851 0
|
8月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
258 17