|
咱有什么说什么,说实在的,这部分我感觉是liunx中最乱的地方,也是最不好学的,也是能看出人最专业的地方,明白我的意思了吧,,,,自己体会。
数组 declare
定义变量的类型
declare 选项 变量名=值
选项有
-i 整形的变量
-r 只读的变量 定义就不可以修改了
-x 系统环境变量
-a 数组变量 想把多个变量定义成一个组
---------
[root@xu ~]# declare -i a=1 b=2
[root@xu ~]# declare -i c=$a*$b
[root@xu ~]# echo $c
2
---------
创建数组
[root@xu ~]# declare -a teaname
----------
查看数组
[root@xu ~]# declare -a
------
数组赋值 (添加信息)
数组名 [元素下标]=值
----------
给数组添加内容
[root@xu ~]# teaname[0]=yzs
[root@xu ~]# teaname[1]=xly
[root@xu ~]# teaname[2]=lili
[root@xu ~]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a teaname='([0]="yzs" [1]="xly" [2]="lili")'
------------
[root@xu ~]# serip=(1.1.1.1 2.2.2.2 3.3.3.3)
[root@xu ~]# declare -a |grep serip
declare -a serip='([0]="1.1.1.1" [1]="2.2.2.2" [2]="3.3.3.3")'
---------------
输出数组元素
[root@xu ~]# echo ${serip[1]}
2.2.2.2
输出全部元素
[root@xu ~]# echo ${serip[@]}
1.1.1.1 2.2.2.2 3.3.3.3
[root@xu ~]# echo ${serip
}
1.1.1.1 2.2.2.2 3.3.3.3
----------
统计数组元素的个数
[root@xu ~]# echo ${#serip
}
3
--------
统计模个元素值的长度 (第一个代表0 第二个代表1 1.1.1.1 是7位.也算)
[root@xu ~]# echo ${#serip[0]}
7
---------
输出模个位置的元素 从所有的数组里选取第2个元素
[root@xu ~]# echo ${serip[@]:2}
3.3.3.3
------
[root@xu ~]# hostname=(www.baidu.com www.sina.com www.uplooking.com)
[root@xu ~]# echo ${hostname[2]}
www.uplooking.com
[root@xu ~]# echo ${hostname[2]:0}
www.uplooking.com
[root@xu ~]# echo ${hostname[2]:4}
uplooking.com
[root@xu ~]# echo ${hostname[2]:4:9} 从第几个开始输出 输出几位
uplooking
--------
把从屏幕输入的三次IP 地址 存放到数组serip里
把数组色日跑得三个元素值输出到屏幕上
1 #!/bin/bash
2 read -p "请输入第一个IP地址" a[0]
3 read -p "请输入第二个IP地址" a[1]
4 read -p "请输入第三个IP地址" a[2]
5
6 echo ${a[@]}
用循环的方式给数组赋值
1 #!/bin/bash
2 read -p "清输入监控主机的台数:" a
3 i=0
4 while [ $i -lt $a ]
5 do
6 read -p "清输入第一台主机ip:" serip[$i]
7 let i++
8 done
9
10
11 echo ${serip[@]}
用循环的方式输出数组元素
1 #!/bin/bash
2 read -p "清输入监控主机的台数:" a
3 i=0
4 while [ $i -lt $a ]
5 do
6 read -p "清输入第一台主机ip:" serip[$i]
7 let i++
8 done
9 echo "-------------------------------------------"
10 for i in `echo ${serip[@]}`
11 do
12 echo $i
13 done
14 echo "----------------------------------------"
15 for ((i=0;i=o o个到多个
+ >= 1 1 个到多个
\? 是0次或1
***************************************************
用grep 的时候 下面的这几个必须要转意
^ $ . [] * \? \+ \{ \} \< >/ \| \( \)
****************************************************
() 保存 匹配的模式
(ab) 一个整体
^pac*j$ c出现0此或者无穷次
^p(ac)*j$ *前面的ac出现0此或者无穷次
[ ] 匹配范围内的也就是任意一个
[afb] 包括 afb里任意一个都匹配
[a-d]只要里面的有任意一个都匹配
[a-Z]所有的字母
.* 表示所有字符
[^a-c] ^在[]表示取反 没有a到c的都匹配
^[a-c] 以abc开头的
^[^a-c] 不以abc开头的行
| 或
(abc|def)* abc出现o到无穷此 或者 def出现0次或者无穷
w(abc|def)x 表示wabcx 或者是wbefx 都匹配
匹配次数
\{ \}指定前面的表达式出现的次数
g\(oo\)\{1\}d =good
g\(oo\)\{2\}d =gooood 俩个oo 出现2次
{2,} >=2
{2,4} >=2 and / 匹配行里以a为结尾的
正则选项
-v 取反
-i 不分大小写
-n 显示匹配文件的行号
-c 显示正则表达式匹配的行数
-q 不显示输出的信息
去掉前面有空格 和#的 只要有效行
[root@xu opt]# grep -v "^$\|^#" /etc/httpd/conf/httpd.conf
面试的时候肯能出现的匹配
匹配出make地址HWADDR
[root@xu opt]# grep "\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}" /etc/sysconfig/network-scripts/ifcfg-eth0
HWADDR=54:E6:FC:71:17:45
ip地址
域名 www . baidu . com
[root@xu opt]# grep "[a-z0-9]\{1,\}\.[a-z0-9]\{1,\}\.[a-z]\{2,3\}" ifcfg-eth0 aaawww.baidu.com
主机名
url 地址 论坛上贴网址的
邮箱
---------------------------------------------------
sed 交换式的流编辑器
打印 删除 替换 复制 剪切 粘贴 导入 导出
处理的时候以行为单位 对文件进行逐行处理
用法
sed [ 选项] “动作” 文件名字
命令 | sed [ 选项] “动作” 文件名字
打印 “p”
会显示两行 一个是原数据 一个是处理完以后的数据
sed "p" /etc/passwd 有两行
sed "p;p" /etc/passwd 多次动作用;间隔
sed "p;=" /etc/passwd = 显示行号
root:x:0:0:root:/root:/bin/bash p打印的内容
1 =显示的内容
root:x:0:0:root:/root:/bin/bash 原数据
bin:x:1:1:bin:/bin:/sbin/nologin
2
bin:x:1:1:bin:/bin:/sbin/nologin
-n 不显示原数据 只显示输出后的结果
[root@xu opt]# sed -n "p" /etc/passwd
打印模几行
[root@xu opt]# sed -n "2,5p" /etc/passwd
[root@xu opt]# sed -n "1p;3p;5p" /etc/passwd
---------------------
删除 d
只删除第一行的显示内容
[root@xu opt]# sed "1d" /etc/passwd
[root@xu opt]# sed "1d;3d" /etc/passwd
起始行 结果行
[root@xu opt]# sed "1,3d" /etc/passwd
加 -i 选项 是操作原文件(慎用)
[root@xu opt]# sed -i "1d" /etc/passwd
------------------------------
用正则表达式来删除 必须要用 / / d 格式匹配
[root@xu opt]# sed -n "/xly/,/abc/d" /etc/passwd
从第 2行开始(包括第2行)在往下删去2行
[root@xu ~]# sed "2,+2d" /etc/passwd
从2开始 删掉第一个是5的倍数行之间的行
[root@xu ~]# sed "2,~5d" /etc/passwd
删除偶数行(能除2的) 每2行删去第1行
[root@xu ~]# sed "1~2d" /etc/passwd
--------------------------------
替换 s “ s / / /gi“ g全局 i忽略大小写
[root@xu ~]# sed -n "s/a/b/gi" /etc/passwd
替换多个范围的 1行到3行
[root@xu ~]# sed -n "1,3s/a/b/gi" /etc/passwd
------
用正则 修改 用// 圈起来
把所有的数字改成字母
[root@xu ~]# sed -n "s/[0-9]/b/g" /etc/passwd
把包含有字母都删除
[root@xu ~]# sed -n "s/[a-z]//g" /etc/passwd
修改运行级别到3
[root@xu ~]# grep initdefault /etc/inittab
# 0 - halt (Do NOT set initdefault to this)
# 6 - reboot (Do NOT set initdefault to this)
id:5:initdefault:
[root@xu ~]# sed "/id/s/[0-6]/3/" /etc/inittab
#
在sed 的正则表达式里
-r
在正则表达式里 不用转意符 可以用-r 解决
[root@xu ~]# sed -r "/id/s/[0-6]{2}/3/" /etc/inittab
把/etc/passwd 文件里 没一行的第一个字符删掉
[root@xu ~]# sed -n "s/.//" /etc/passwd
把/etc/passwd 文件里 每一行的第一个和最后一个字符删掉
() 保存所匹配的字符 & 代替你查找的所有字符
每一个模式 是\1 \2 ...\9 每个模式对应前面的第几个()里的内容
出现在第一个 是开头 第二个是去掉最后一个的所有内容 的三个是最后一个内容
[root@xu ~]# sed -n -r "s/(.)(.*)(.)/\2/" /etc/passwd
修改ip最后的地址为254
[root@xu opt]# sed -r "s/(192.168.1.)(.*)/\1254/" ip.txt
192.168.1.254
192.168.1.254
192.168.1.254
192.168.1.254
192.168.1.254
192.168.1.254
192.168.1.254
把一个文件所有的大写 字母加上个小括号
[root@xu opt]# sed "s/[A-Z]/(&)/g" /etc/passwd
-----------------------
添加 a 默认的是每一行都添加一个
[root@xu opt]# sed -r "aGATEWAY=192.168.1.254" ifcfg-eth0
指定位置添加
[root@xu opt]# sed -r "1aGATEWAY=192.168.1.254" ifcfg-eth0
插入 i 插入到上面
[root@xu opt]# sed -r "1iGATEWAY=192.168.1.254" ifcfg-eth0
替换 c
第一行替换成GATEWAY....
[root@xu opt]# sed -r "1cGATEWAY=192.168.1.254" ifcfg-eth0
导入 r
把有a里的内容 导入到搜索出来1这行的内容的下面
把只要有1的行导入到a.txt里去
什么内容到导入到那里原文件
[root@xu opt]# sed -r "/1/r a.txt" 1.txt
导出 w
把有a的内容写到 1.txt里去 会覆盖之前的内容
把只要有a的导出到1.txt里
[root@xu opt]# sed -r "/a /w 1.txt" a.txt
------------
命令组
root@xu opt]# sed -n "2=;2p" a.txt
[root@xu opt]# sed -n "2{=;p}" a.txt
-e 如果有多个命令要执行的时候 可以加多个 -e 连起来 作成一个命令组
[root@xu opt]# sed -n -e "2=" -e "2p" a.txt、
除了第一行剩下的内容 取反
[root@xu opt]# sed -n "1 ! p" 2.txt
-------------------------
删出 d
[root@xu opt]# sed "d" a.txt
4n 把当前行 读出下一行 也就是 第4行不读 其他的 都读
[root@xu opt]# sed "4n;d" a.txt
-----------------
sed 复制
有俩个空间 sed的缓存
一个是模式空间 里面不存数据
当sed 处理一个流的时候 他会把他放到 里买 处理的时候拿进来 处理完了拿出去
二个是保持空间
默认情况下什么都没有 只有一个换行符\n
俩个选项
剪贴
H 追加导入到保持空间
h 覆盖导入到保持空间
[root@xu opt]# sed "1h;1d;5G" 2.txt
粘贴
G 追加粘贴到模式空间
g 覆盖粘贴到模式空间
[root@xu opt]# sed "1H;5G" 2.txt
[root@xu opt]# sed "1,3h;5G" 2.txt
-------------------------------------
awk 单独的一门语言 也是逐行处理
awk 的格式
awk [选项] “动作” 文件名
命令 | awk [选项] “动作” 文件名
awk -F":" '{print FILENAME}'
位置变量 第一列的值就是$1
$1 。。。$n 分割
$0 代表整个行的信息
位置变量
[root@xu opt]# awk -F":" '{print $1,$2}' /etc/passwd
[root@xu opt]# head /etc/passwd | awk -F":" '{print $1,$2}'
打印当前文件名 FILENAME
[root@xu opt]# awk -F":" '{print FILENAME}' /etc/passwd
打印分割类的个数 NF
[root@xu opt]# awk -F":" '{print NF}' /etc/passwd
当前处理行的行数 NR
[root@xu opt]# awk -F":" '{print NR}' /etc/passwd
处理当前行在文件内的行数FNR
[root@xu opt]# awk -F":" '{print FNR}' /etc/passwd
AWK的默认分隔符 为空格 和 tab键默认时可以省略 -F
[root@xu opt]# head -3 /etc/passwd | awk -F":" '{print $1,$3,$4}'
root 0 0
bin 1 1
daemon 2 2
-------------
awk 处理数据的时候顺序是三个 行前 行中 行后
行前
BEGIN{}
[root@xu opt]# awk -F":" 'BEGIN{print NR}' /etc/passwd
0
行中
{}
[root@xu opt]# awk -F":" '{print NR}' /etc/passwd
行后的
END{}
[root@xu opt]# awk -F":" 'END{print NR}' /etc/passwd
73
-------------------
用正则
awk '条件{print NR}'
~ 匹配
!~ 不匹配
匹配是root的
[root@xu opt]# awk -F ":" '$1~/root/{print $1}' /etc/passwd
root
比较符号
= == != > >= < |
|
|