Tag Archive: shell

十二月 20th, 2017

1、获取信息

#!/bin/bash
#描述:
#    把top信息输入到一个文件内部
#作者:孤舟点点
#版本:1.0
#创建时间:2017-11-09 03:04:28
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

p=`pwd`
Day=`date +"%Y%m%d"`
HOST=`hostname`

for((i=0; i<1440; i=i+1))
  do
    echo "Date `date +"%Y-%m-%d %H:%M:%S"`" >>$p/$Day-top.txt
    top c -bn1 >>$p/$Day-top.txt
    sleep 1
  done
 

2、筛选信息

 
#!/bin/bash
#描述:

#作者:孤舟点点
#版本:1.0
#创建时间:2017-11-09 04:08:52
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

p=`pwd`
Day=`date +"%Y%m%d"`
HOST=`hostname`

mkdir -p $p/$HOST-$Day
PT=$p/$HOST-$Day
cd $PT

cat $p/$1 | grep -v grep | grep "^Date" >> $PT/Time-$Day.txt
cat $p/$1 | grep -v grep | grep "^Cpu(s):" >> $PT/CPU-$Day.txt
cat $p/$1 | grep -v grep | grep "^Mem:"  >> $PT/Mem-$Day.txt
cat $p/$1 | grep -v grep | grep "^Swap:" >> $PT/Cache-$Day.txt

while read line
do
    cat $p/$1 | grep -v grep | grep "$line" >> $PT/$line-$Day.txt
done < $p/service.txt
# 这里service.txt是按行存放的服务名称

cd $p

3、整理数据

例如用Excel整理内存使用情况,这里把获取的时间和内存信息放在Excel内部,并把内存列用Excel分列,用时间和使用的内存大小列可以制作出一张内存使用趋势图;同理也可以制作CPU、cached及各个微服务的CPU和内存趋势图。

 

原文链接:http://www.centoscn.com/shell/2017/1118/9242.html

TAGS:
八月 31st, 2017

# 该脚本使用guestmount工具,可以将虚拟机的磁盘系统挂载到真实机文件系统中

# Centos7.2中安装libguestfs-tools-c可以获得guestmount工具

# 虚拟机可以启动或者不启动都不影响该脚本的使用

# 将虚拟机磁盘文件挂载到文件系统后,就可以直接读取磁盘文件中的网卡配置文件中的数据该脚本使用guestmount工具,可以将虚拟机的磁盘系统挂载到真实机文件系统中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
#该脚本使用guestmount工具,可以将虚拟机的磁盘系统挂载到真实机文件系统中
#Centos7.2中安装libguestfs-tools-c可以获得guestmount工具
#虚拟机可以启动或者不启动都不影响该脚本的使用
#将虚拟机磁盘文件挂载到文件系统后,就可以直接读取磁盘文件中的网卡配置文件中的数据
clear
mountpoint="/media/virtimage"
[ ! -d $mountpoint]&& mkdir $mountpoint
read -p "输入虚拟机名称:" name
echo "请稍后..."
#如果有设备挂载到该挂载点,则先umount卸载
if mount grep -q"$mountpoint" ;then
       umount $mountpoint
fi
#只读的方式,将虚拟机的磁盘文件挂载到特定的目录下,这里是/media/virtimage目录
guestmount -r -d $name -i$mountpoint
echo
echo"--------------------------------------------"
echo -e "\033[32m$name虚拟机中网卡列表如下:\033[0m"
dev=$(ls /media/virtimage/etc/sysconfig/network-scripts/ifcfg-*|awk -F"[/-]" '{print $9}')
echo $dev
echo"--------------------------------------------"
 
echo
echo
echo"+++++++++++++++++++++++++++++++++++++++++++"
echo -e "\033[32m网卡IP地址信息如下:\033[0m"
for in $dev
do
       echo -n "$i:"
       grep -q "IPADDR"/media/virtimage/etc/sysconfig/network-scripts/ifcfg-$i || echo "未配置IP地址"
       awk -F= '/IPADDR/{print $2}'/media/virtimage/etc/sysconfig/network-scripts/ifcfg-$i
done
echo "+++++++++++++++++++++++++++++++++++++++++++"
TAGS: ,
六月 29th, 2017

GNOME Shell概述中的搜索结果可能很快就会看起来有点整洁。作为今年Google夏季代码的一部分,GNOME Shell搜索列表的外观和布局的改进正在进行之中。

更新的设计,将从2015年的GNOME设计团队模型出发,更好地利用空间,为本地文件和文件夹结果提供更多信息,并使用较小的应用程序/结果图标,使列表更易于扫描。

Rares Visalom在他的博客上写道:“我正在努力修改这个错误,我可以高兴地说,这几乎完成了。一些微小的调整,它将看起来就像在图片中的那样。“

“还有一些关于添加转换的问题(但是到目前为止还没有确定),就是这样。我会很快写下另一篇文章,当搜索结果看起来就像模型!“

调整后的概览列表仅仅是今年“Google夏季编码”中几个与GNOME相关的更改之一。其他项目包括向GNOME Calendar添加经常性事件;在GNOME磁盘中添加修改和修复文件系统的选项;并在GNOME Games应用程序中添加对游戏手柄和键盘配置的支持。

TAGS: ,
三月 29th, 2017

Vim——正如你可能已经了解的那样——是一个包含很多特性的强大的编辑器。我们已经写了好多关于 Vim 的教程,覆盖了 基本用法、 插件, 还有一些 其他的 有用的 特性。鉴于 Vim 提供了多如海洋的特性,我们总能找到一些有用的东西来和我们的读者分享。

在这篇教程中,我们将会重点关注你如何在编辑窗口执行外部的命令,并且访问命令行 shell。

但是在我们开始之前,很有必要提醒一下,在这篇教程中提及到的所有例子、命令行和说明,我们已经在 Ubuntu 14.04 上测试过,我们使用的的 Vim 版本是 7.4 。

在 Vim 中执行外部命令

有的时候,你可能需要在 Vim 编辑窗口中执行外部的命令。例如,想象一下这种场景:你已经在 Vim 中打开了一个文件,并做了一些修改,然后等你尝试保存这些修改的时候,Vim 抛出一个错误说你没有足够的权限。

在 Vim 中执行命令行

在 Vim 中执行命令行

现在,退出当前的 vim 会话,重新使用足够的权限打开文件将意味着你会丢失所做的所有修改,所以,你可能赞同,在大多数情况不是只有一个选择。像这样的情况,在编辑器内部运行外部命令的能力将会派上用场。

稍后我们再回来上面的用例,但是现在,让我们了解下如何在 vim 中运行基本的命令。

假设你在编辑一个文件,希望知道这个文件包含的行数、单词数和字符数。为了达到这个目的,在 vim 的命令行模式下,只需要输入冒号 :,接下来一个感叹号 !,最后是要执行的命令(这个例子中使用的是 wc)和紧接着的文件名(使用 % 表示当前文件)。

  1. :! wc %

这是一个例子:

填入的上面提及的命令行准备执行:

命令准备在 vim 中执行

命令准备在 vim 中执行

下面是终端上的输出:

命令输出

命令输出

在你看到输出之后,输入回车键,你将会退回到你的 vim 会话中。

你正在编写代码或者脚本,并且希望尽快知道这段代码或者脚本是否包含编译时错误或者语法错误,这个时候,这种特性真的很方便。

继续,如果需求是添加输出到文件中,使用 :read ! 命令。接下来是一个例子:

  1. :read ! wc %

read 命令会把外部命令的输出作为新的一行插入到编辑的文件中的当前行的下面一行。如果你愿意,你也可以指定一个特定的行号——输出将会添加到特定行之后。

例如,下面的命令将会在文件的第二行之后添加 wc 的输出。

  1. :2read ! wc %

注意: 使用 $ 在最后一行插入, 0 在第一行前面插入。

现在,回到最开始我们讨论的一个用例,下面的命令将会帮助你保存文件而不需要先关闭文件(这将意味着没有保存的内容不会丢失)然后使用 sudo 命令重新打开。

  1. :w ! sudo tee %

在 Vim 中访问 shell

除了可以执行单独的命令,你也可以在 vim 中放入自己新创建的 shell。为了达到这种目的,在编辑器中你必须要做的是运行以下的命令:

  1. :shell

或者:

  1. :sh

当你执行完了你的 shell 任务,输入 exit —— 这将带你回到原来离开的 Vim 会话中。

要谨记的漏洞

虽然在真实世界中,能够访问的 shell 绝对符合它们的用户权限,但是它也可以被用于提权技术。正如我们在早期的一篇文章(在 sudoedit 上)解释的那样,即使你提供给一个用户 sudo 的权限只是通过 Vim 编辑一个文件,他们仍可以使用这项技术从编辑器中运行一个新的 shell,而且他们可以做 root 用户或者管理员用户可以做的所有内容。

总结

能够在 Vim 中运行外部命令在好多场景中(有些场景我们已经在这篇文章中提及了)都是一个很有用的特性。这个功能的学习曲线并不麻烦,所以初学者和有经验的用户都可以好好使用它。

TAGS: ,
三月 17th, 2017

在 Linux 系统下,Shell 脚本可以在各种不同的情形下帮到我们,例如展示信息,甚至 自动执行特定的系统管理任务,创建简单的命令行工具等等。

在本指南中,我们将向 Linux 新手展示如何可靠地存储自定义的 shell 脚本,解释如何编写 shell 函数和函数库,以及如何在其它的脚本中使用函数库中的函数。

Shell 脚本要存储在何处

为了在执行你自己的脚本时不必输入脚本所在位置的完整或绝对路径,脚本必须被存储在 $PATH 环境变量所定义的路径里的其中一个。

使用下面的命令可以查看你系统中的 $PATH 环境变量:

  1. $ echo $PATH
  2. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

通常来说,如果在用户的家目录下存在名为 bin 的目录,你就可以将 shell 脚本存储在那个目录下,因为那个目录会自动地被包含在用户的 $PATH 环境变量中(LCTT 译注:在 Centos 6/7 下是这样的,在 Debian 8 下不是这样的,在 Ubuntu 16.04 下又是这样的)。

因此,在你的主目录下创建 bin 目录吧(当然这里也可以用来存储 Perl、Awk 或 Python 的脚本,或者其它程序):

  1. $ mkdir ~/bin

接着,建立一个名为 lib(libraries 的简写)的目录来存放你自己的函数库。你也可以在其中存放其它编程语言的函数库,如 C ,Python 等语言。在 lib 目录下建立另一个名为 sh 的目录,这个目录将被用来存放你的 shell 函数库:

  1. $ mkdir -p ~/lib/sh

创建你自己的 Shell 函数和函数库

一个 shell 函数 就是在脚本中能够完成特定任务的一组命令。它们的工作原理与其他编程语言中的过程(LCTT 译注:可能指的是类似 SQL 中的存储过程之类的吧)、子例程、函数类似。

编写一个函数的语法如下:

  1. 函数名() { 一系列的命令 }

( LCTT 校注:在函数名前可以加上 function 关键字,但也可省略不写)

例如,你可以像下面那样在一个脚本中写一个用来显示日期的函数:

  1. showDATE() {date;}

每当你需要显示日期时,只需调用该函数的函数名即可:

  1. $ showDATE

简单来说 shell 函数库也是一个 shell 脚本,不过你可以在一个函数库中仅存储其它 shell 脚本中需要调用的函数。

下面展示的是在我的 ~/lib/sh 目录下一个名为 libMYFUNCS.sh 的库函数:

  1. #!/bin/bash
  2. ### Function to clearly list directories in PATH
  3. showPATH() {
  4. oldifs="$IFS" ### store old internal field separator
  5. IFS=: ### specify a new internal field separator
  6. for DIR in $PATH<br> do<br> echo $DIR<br> done
  7. IFS="$oldifs" ### restore old internal field separator
  8. }
  9. ### Function to show logged user
  10. showUSERS() {
  11. echo -e Below are the user logged on the system:\n
  12. w
  13. }
  14. ### Print a user’s details
  15. printUSERDETS() {
  16. oldifs="$IFS" ### store old internal field separator
  17. IFS=: ### specify a new internal field separator
  18. read -p "Enter user name to be searched:" uname ### read username
  19. echo ""
  20. ### read and store from a here string values into variables
  21. ### using : as a field delimiter
  22. read -r username pass uid gid comments homedir shell <<< "$(cat /etc/passwd | grep "^$uname")"
  23. ### print out captured values
  24. echo -e "Username is : $username\n"
  25. echo -e "User's ID : $uid\n"
  26. echo -e "User's GID : $gid\n"
  27. echo -e "User's Comments : $comments\n"
  28. echo -e "User's Home Dir : $homedir\n"
  29. echo -e "User's Shell : $shell\n"
  30. IFS="$oldifs" ### store old internal field separator
  31. }

保存文件并且给脚本添加执行权限。

如何从函数库中调用函数

要使用某个 lib 目录下的函数,首先你需要按照下面的形式 将包含该函数的函数库导入到需要执行的 shell 脚本中:

  1. $ . /path/to/lib
  2. $ source /path/to/lib

(LCTT 译注:第一行的 . 和路径间必须是有空格的)

这样你就可以像下面演示的那样,在其它的脚本中使用来自 ~/lib/sh/libMYFUNCS.shprintUSERDETS 函数了。

在下面的脚本中,如果要打印出某个特定用户的详细信息,你不必再一一编写代码,而只需要简单地调用已存在的函数即可。

创建一个名为 test.sh 的新文件:

  1. #!/bin/bash
  2. ### include lib
  3. . ~/lib/sh/libMYFUNCS.sh
  4. ### use function from lib
  5. printUSERDETS
  6. ### exit script
  7. exit 0

保存这个文件,并使得这个脚本可被执行,然后运行它:

  1. $ chmod 755 test.sh
  2. $ ./test.sh

编写 shell 函数

TAGS: ,
十二月 15th, 2016
TAGS: ,
十一月 27th, 2016

Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。

Shell 在线工具


Shell 脚本

Shell 脚本(shell script),是一种为shell编写的脚本程序。

业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的”shell编程”都是指shell脚本编程,不是指开发shell自身。


Shell 环境

Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux的Shell种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash

#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。


第一个shell脚本

打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。

输入一些代码,第一行一般是这样:

实例

#!/bin/bash
echo “Hello World !”

运行实例 »

“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

echo命令用于向窗口输出文本。

运行Shell脚本有两种方法:

1、作为可执行程序

将上面的代码保存为test.sh,并cd到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

 

原文链接:http://www.runoob.com/linux/linux-shell.html

TAGS: ,
十一月 24th, 2016

Shell 数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

与大部分编程语言类似,数组元素的下标由0开始。

Shell 数组用括号来表示,元素用”空格”符号分割开,语法格式如下:

array_name=(value1 ... valuen)

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array=(A B "C" D)

我们也可以使用下标来定义数组:

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

读取数组

读取数组元素值的一般格式是:

${array_name[index]}

实例

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array=(A B "C" D)

echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

获取数组中的所有元素

使用@ 或 * 可以获取数组中的所有元素,例如:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组的元素为: A B C D
数组的元素为: A B C D

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组元素个数为: 4
数组元素个数为: 4
十一月 24th, 2016

Shell 传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

实例

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如”$@”用「”」括起来的情况、以”$1″ “$2” … “$n” 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

$* 与 $@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 ” * ” 等价于 “1 2 3″(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
TAGS: ,
九月 5th, 2016

有时我们在处理和查看文件时,经常会有很多空行,为了美观或是有需要时,就有必要把这些除行去掉了,方法如下:

1)用tr命令

代码如下:
cat 文件名 |tr -s ‘\n’

2)用sed命令

 代码如下:
cat 文件名 |sed ‘/^$/d’

3)用awk命令

代码如下:
cat 文件名 |awk ‘{if($0!=””)print}’
cat 文件名 |awk ‘{if(length !=0) print $0}’

4)用grep命令

代码如下:
grep -v “^$” 文件名
TAGS: ,