第三周

grep Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
--color=auto 关键字高亮显示,在centos7当中默认做为别名
-v 显示不被匹配到的行
-i 忽略关键字的大小写
-c 显示匹配行的数量
-o 仅显示匹配到的关键字
-q 静默输出,不打印过滤的结果,也可以用 &> /dev/null
-A x 当前行及后x行
-B x 当前行及前x行
-C x 当前行及前后x行
nmap -v -sP 172.18.118.0/24 |grep -B1 'Host is up' |grep for |cut -d" " -f5
-e 关键字1 -e 关键字2 或者 "关键字1|关键字2" 表示逻辑或
-w 匹配整个单词 表示字符边界 也可以用 "\<关键字\>"
-E 或 egrep 表示使用扩展正则表达式
-F 或 fgrep 不使用正则表达式

正则表达式

文件名通配符当中 * 表示 0或多个任意字符 ? 表示任何一个单一字符

正则当中
字符匹配

.  表示任何字符  任意内容 不管次数
[]   匹配指定范围内的任意单个字符
[^]  匹配指定范围外的任意单个字符
[:alnum:] 字母和数字 
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母  [a-z]  
[:upper:] 大写字母  [A-Z]
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字  [0-9]
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[A-Z0-9] 表示大写字符或数字

次数匹配

 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
    * 匹配前面的字符任意次,包括0次 0或无限

        ./*贪婪模式:尽可能长的匹配
    .* 任意长度的任意字符 
    \? 匹配其前面的字符0或1次
    \+ 匹配其前面的字符至少1次
    \{n\} 匹配前面的字符n次
    \{m,n\} 匹配前面的字符至少m次,至多n次
    \{,n\} 匹配前面的字符至多n次
    \{n,\} 匹配前面的字符至少n次

位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]$ 空白行
grep -v "^[[:space:]]
$" passwd 去除文件中的空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\<PATTERN\> 匹配整个单词
grep "\<root\>" passwd

实验:通过以下文件,找出以rxxt开头且以相同rxxt结尾,并uid与gid相同的用户
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
rcct:x:1:1:bin:/bin:/sbin/rcct
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
roat:x:4:7:lp:/var/spool/lpd:/sbin/roat
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:Root:/sbin:/sbin/shutdown
roat:x:6:0:Root:/sbin:/sbin/root
halt:x:7:0:halt:/sbin:rooter:/halt
rbbt:x:8:12:mail:/var/spool/mail:/sbin/root
operator:x:11:0:operator:/root1:/sbin/root
root:x:100:100:games:/usr/games:/sbin/root
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

cat passwd |grep "^(\<r..t\>).([0-9]+):\2.\1$"

扩展正则写法:
cat passwd |egrep "^(\<r..t\>).([0-9]+):\2.\1$"

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
grep "^s|^S" /proc/meminfo
grep "^(s|S)" /proc/meminfo
cat /proc/meminfo | grep -i "^s"
cat /proc/meminfo | grep "^[sS]"
grep -e ^s -e ^S /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd
3、显示用户rpc默认的shell程序
grep '^\<rpc\>' /etc/passwd|cut -d: -f7
getent passwd rpc |cut -d: -f7

4、找出/etc/passwd中的两位或三位数
cat /etc/passwd | grep -o "[0-9]{2,3}"

VIM

command(命令模式) 默认模式 移动光标,复制,剪切,撤消,重做…… 进入其他的模式。
ZQ强制退出不保存
ZZ保存并退出
G:跳到最后一行
gg:跳到第一行
r:单个字符的替换
dd 剪切一行
p 在当前行的下一行粘贴
P 在当前行的上一行粘贴
yy 复制一行
yw 复制一个单词
y$ 复制光标所在位置到行尾
y^ 复制光标所在位置到行首
num y: 复制当前行及其向下指定数量的行
v 选择模式
p 粘到光标所在处之后
P 粘到光标所在处之前
V 多行选择模式
p 在当前行的下一行粘贴
P 在当前行的上一行粘贴

insert(插入模式) 编辑文本内容
i ESC回到命令模式
I 光标跳至行首并进入插入模式
A 光标跳至行尾并进入插入模式
a 光标向后移动一个字符并进入插入模式
o 光标向下插入一个新行并进入插入模式
O 光标向上插入一个新行并进入插入模式

exit(退出模式) 保存,退出 :
w保存
q退出
q!强制退出不保存
wq保存并退出
w!强制保存:
1.root
2.文件的owner
3.当前用户对当前文件所在目录有wx权限时,实际会删除该文件再新建。
x=wq
x!
回到命令模式
EscEsc
Esc 等一会
Enter
:r /etc/issue 读取文件内容,将内容输入到当前文本的最后
:! ifconfig ens33 将命令的输出结果显示,并不存入文件,按q结束命令输出
:r! ifconfig ens33 将命令的输出结果输入到当前光标所在行的下一行
:.! ifconfig ens33 将命令的输出结果输入到前当行,替换原有内容

:%s/\<root\>/rooter/g

    :%s/\(\<r..t\>\)/\1er/gi   支持基本正则表达式 不加g时每行的第一个关键字替换,加g则全替换
            chmod +x 给文件执行权限   .加文件名执行文件

局部变量:只对当前shell有效 ,可使用set查看
环境变量:对当前shell及期子shell都有效,可使用set、env查看
export 本地变量名
export 变量名=值
若修改环境变量的值 ,可直接变量名=值而不再需要加export

位置化变量
echo '$1' is:$1
echo '$2' is:$2
echo '$3' is:$3
echo '$4' is:$4
echo '$0' is:$0
echo '$10' is:${10}
echo '$' is:$
echo '$#' is:$#

特殊变量
?:表示上一条命令的执行成功与否:0为成功,非0为失败
0 :位置化变量中的命令本身

  • :位置化变量中的所有参数
    @ : 位置化变量中的所有参数 # :位置化变量的个数
    $ :显示当前Shell的进程号
    unset A 删除变量
    readonly 变量名
    declare -r 变量名=值

位置化变量
只读变量:只能声明,但不能修改和删除
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly –p

位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ...:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $
只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量

实验:编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

#!/bin/bash
[ $# -eq 0 ] && echo 至少应该给一个参数 && exit 1
grep "^[[:space:]]*$" $1 |wc -l

实验:写一个创建用户的脚本,会询问用户用户名及密码,要求密码输入过程不可见
方法一:
#!/bin/bash
read -p "Please Enter your username: " name
echo -n "Please Enter the password for $name: "
stty -echo
read password
stty echo
echo
useradd $name
echo $password |passwd --stdin $name &> /dev/null
echo "$name created"

方法二:
#!/bin/bash
read -p "Please Enter your username: " name
read -sp "Please Enter the password for $name: " password
echo
useradd $name
echo $password |passwd --stdin $name &> /dev/null
echo "$name created"

转译
\ 完全单个转译
'' 完全范围转译
"" 不完全范围转译对于以下四个符号不可转译
不能去! \ $ `
A="my hostname is $(hostname)"
[root@instructor_v7(nanyibo) app]# echo $A
my hostname is instructor.magedu.com

猜你喜欢

转载自blog.51cto.com/13769375/2127849