基础命令和脚本练习初识

基础命令和脚本练习初识

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

# 就完事了嗷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值