基础命令和脚本练习初识
grep
Linux grep 命令用于查找文件里符合条件的字符串。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数:
- -a 或 --text : 不要忽略二进制的数据。
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -q 或 --quiet或–silent : 不显示任何信息。
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
- -s 或 --no-messages : 不显示错误信息。
- -v 或 --revert-match : 显示不包含匹配文本的所有行。
- -V 或 --version : 显示版本信息。
- -w 或 --word-regexp : 只显示全字符合的列。
- -x --line-regexp : 只显示全列符合的列。
- -y : 此参数的效果和指定"-i"参数相同。
cut
Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。
语法
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
参数:
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- -c :以字符为单位进行分割。
- -d :自定义分隔符,默认为制表符。
- -f :与-d一起使用,指定显示哪个区域。
- -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
sort
Linux sort命令用于将文本文件内容加以排序。
sort可针对文本文件的内容,以行为单位来排序。
语法
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
参数说明:
- -b 忽略每行前面开始出的空格字符。
- -c 检查文件是否已经按照顺序排序。
- -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
- -f 排序时,将小写字母视为大写字母。
- -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
- -k:指定要排序的key,key由字段组成。key格式为"POS1[,POS2]",POS1为key起始位置,POS2为key结束位置。
- -m 将几个排序好的文件进行合并。
- -M 将前面3个字母依照月份的缩写进行排序。
- -n 依照数值的大小排序。
- -u 意味着是唯一的(unique),输出的结果是去完重了的。
- -o<输出文件> 将排序后的结果存入指定的文件。
- -r 以相反的顺序来排序。
- -t<分隔字符> 指定排序时所用的栏位分隔字符。
- +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
- –help 显示帮助。
- –version 显示版本信息。
tail
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。
tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
命令格式:
tail [参数] [文件]
参数:
- -f 循环读取
- -q 不显示处理信息
- -v 显示详细的处理信息
- -c<数目> 显示的字节数
- -n<行数> 显示文件的尾部 n 行内容
- –pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
- -q, --quiet, --silent 从不输出给出文件名的首部
- -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
netstat
Linux netstat命令用于显示网络状态。
利用netstat指令可让你得知整个Linux系统的网络情况。
语法
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
参数说明:
- -a或–all 显示所有连线中的Socket。
- -A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址。
- -c或–continuous 持续列出网络状态。
- -C或–cache 显示路由器配置的快取信息。
- -e或–extend 显示网络其他相关信息。
- -F或–fib 显示FIB。
- -g或–groups 显示多重广播功能群组组员名单。
- -h或–help 在线帮助。
- -i或–interfaces 显示网络界面信息表单。
- -l或–listening 显示监控中的服务器的Socket。
- -M或–masquerade 显示伪装的网络连线。
- -n或–numeric 直接使用IP地址,而不通过域名服务器。
- -N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。
- -o或–timers 显示计时器。
- -p或–programs 显示正在使用Socket的程序识别码和程序名称。
- -r或–route 显示Routing Table。
- -s或–statistice 显示网络工作信息统计表。
- -t或–tcp 显示TCP传输协议的连线状况。
- -u或–udp 显示UDP传输协议的连线状况。
- -v或–verbose 显示指令执行过程。
- -V或–version 显示版本信息。
- -w或–raw 显示RAW传输协议的连线状况。
- -x或–unix 此参数的效果和指定"-A unix"参数相同。
- –ip或–inet 此参数的效果和指定"-A inet"参数相同。
tr
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
语法
tr [-cdst][--help][--version][第一字符集][第二字符集]
tr [OPTION]…SET1[SET2]
参数说明:
- -c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
- -d, --delete:删除指令字符
- -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
- -t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
- –help:显示程序用法信息
- –version:显示程序本身的版本信息
uniq
Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
uniq 可检查文本文件中重复出现的行列。
语法
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
参数:
- -c或–count 在每列旁边显示该行重复出现的次数。
- -d或–repeated 仅显示重复出现的行列。
- -f<栏位>或–skip-fields=<栏位> 忽略比较指定的栏位。
- -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符。
- -u或–unique 仅显示出一次的行列。
- -w<字符位置>或–check-chars=<字符位置> 指定要比较的字符。
- –help 显示帮助。
- –version 显示版本信息。
练习
1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户数,并将用户都显示出来
# grep、cut
[flamenca@localhost ~]$ grep -v '/sbin/nologin' /etc/passwd|cut -d: -f1
root
sync
shutdown
halt
flamenca
gentoo
slackware
hadoop
wang
2.查出用户UID最大值的用户名,UID及shell类型
# sort、tail、cut
# 我们分步骤来做题
# 1.用sort命令来将passwd中的内容按UID排序(以:分割 第3位是UID,然后从大到小排序)
[flamenca@localhost ~]$ sort -t ':' -k 3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...
wang:x:1004:1004::/home/wang:/bin/bash
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
# 排最后的肯定就是UID最大的,现在我们要用tail命令取出最后一行,然后用cut命令切割
# 先用tail命令取出最后一行
[flamenca@localhost ~]$ sort -t ':' -k 3 -n /etc/passwd |tail -1
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
#最后取出用户名,UID和shell类型
[flamenca@localhost ~]$ sort -t ':' -k 3 -n /etc/passwd |tail -1|cut -d: -f1,3,7
nfsnobody:65534:/sbin/nologin
3.统计当前连接本机的的每个远程主机IP的连接数,并按从大到小排序
# netstat tr uniq sort
# 一步一步来
# 首先先统计当前连接本机的连接情况
[flamenca@localhost ~]$ netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 localhost.localdoma:ssh 192.168.33.1:11855 ESTABLISHED
# 用-n可以数字化IP地址,我们试一试
[flamenca@localhost ~]$ netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 192.168.33.128:22 192.168.33.1:11855 ESTABLISHED
# 我们通过对比可以注意到,localhost.localdoma:ssh 变成了 192.168.33.128:22
# 哇! 都是英文,这是什么呀!
# 别急,我们一点点看: Proto显示连接使用的协议 "Recv-Q"和"Send-Q"指的是接收队列和发送队列
# Local Address:代表本地地址 ,foreignaddress:就是和你电脑有联系的ip地址
# ESTABLISHED:代表一个打开的连接
# 接着来呗,现在我们要选中带地址的内容行 很简单,用grep取出带数字的行就行
[flamenca@localhost ~]$ netstat -nt|grep [0-9]
tcp 0 52 192.168.33.128:22 192.168.33.1:11855 ESTABLISHED
# 空格太多了怎么办,我们可以用tr命令将诸多空格合并变成一个空格呀5
[flamenca@localhost ~]$ netstat -nt|grep [0-9]|tr -s " "
tcp 0 52 192.168.33.128:22 192.168.33.1:11855 ESTABLISHED
# 瘦身成功,对了,题目要我们干啥来着? 提取远程连接的IP,统计数量,从大到小排序
# 提取远程ip和排序我们会了,那统计数量就要用到uniq,从大到小排序是排序uniq -c 返回的值
[flamenca@localhost ~]$ netstat -nt|grep [0-9]|tr -s " " |cut -d " " -f5 |uniq -c
1 192.168.33.1:11855
# 排个序
[flamenca@localhost ~]$ netstat -nt|grep [0-9]|tr -s " " |cut -d " " -f5 |uniq -c |sort -k 1 -nr
1 192.168.33.1:11855
4.编写脚本createuser.sh ,实现如下功能:使用一个用户名作为参数,如果指定参数的用户存在,则显示其存在,否则添加之,并显示添加的用户的id号等信息。
#!/bin/bash
#
#****************************************************
#Author: Flamenca
#QQ: 448333863
#Date: 2020-03-16
#FileName: createuser.sh
#URL:
#Description: createuser test
#Copyright (C): 2020 All rights reserved
#***************************************************
read -p "Plaese Input your Username : " username
# 判断$username是否已经存在,如果存在提示存在
if `id $username &> /dev/null`;then
# &> /dev/null的意思就是把你运行命令的过程转向到/dev/null中,在linux中,/dev/null就是无底洞的意思,意思就是说,你命令执行的过程(一般会显示反回结果)你不想看到,所以就丢这里了。
# 我们就是要判断一下该用户名是否存在
# 如果存在
echo " $username already exist, please try another one !"
# 如果不存在
else
# 添加用户
`useradd $username &> /dev/null`
# 设定个初始密码123
`echo "123" |passwd --stdin $username $> /dev/null`
echo "Username : $username | passwd :"123" "
echo "Please change your password as soon as possible!"
fi
# 删除变量$username
unset username
# 这个脚本的开头是不是特别酷炫?
# 是自动生成的哦,酷炫吧
# 怎么做到的?
# 看下方
5.编写生成脚本基本格式的脚本,包括作者、联系方式、版本、时间、描述等
# 一般向我用vim编辑器的话,在家目录下的.vimrc中输入
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e")=='sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#****************************************************")
call setline(4,"#Author: Flamenca")
call setline(5,"#QQ: 448333863")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: ")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
call setline(11,"#***************************************************")
call setline(12,"")
endif
endfunc
# 就完事了嗷
396

被折叠的 条评论
为什么被折叠?



