getopt用法
#!/bin/bash
#echo $@
#-o或--options选项后面接可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
#-l或--long选项后面接可接受的长选项,用逗号分开,冒号的意义同短选项。
#-n选项后接选项解析错误时提示的脚本名字
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"`
if [ $? != 0 ]; then
echo "Terminating..."
exit 1
fi
#echo $ARGS
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"
while true
do
case "$1" in
-a|--along)
echo "Option a";
shift
;;
-b|--blong)
echo "Option b, argument $2";
shift 2
;;
-c|--clong)
case "$2" in
"")
echo "Option c, no argument";
shift 2
;;
*)
echo "Option c, argument $2";
shift 2;
;;
esac
;;
--)
shift
break
;;
*)
echo "Internal error!"
exit 1
;;
esac
done
#处理剩余的参数
for arg in $@
do
echo "processing $arg"
done
getopts用法
while getopts f:c:opts
do
case $opts in
f)
file=“$OPTARG”;;
c)
cmd="$OPTARG";;
*)
echo "usage : `basename $0` -f -c";;
esac
basename用法
basename命令格式:
basename [pathname] [suffix]
basename [string] [suffix]
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
用法示例:
$ basename /usr/bin/sort 输出"sort"。
$ basename ./include/stdio.h .h 输出"stdio"。
为basename指定一个路径,basename命令会删掉所有的前缀包括最后一个slash(‘/’)字符,然后将字符串显示出来。
shift用法
1.shell脚本中的位置参数
shell脚本中的位置参数有两种:
一种是调用脚本时传给脚本的参数,另一种是调用脚本的函数时,传给函数的参数。
2.shift
shift可以用来向左移动位置参数。
使用方法:
shift num 将位置参数向左移动num个位置,默认情况下num为1.
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
非常有用的 Unix 命令:shift。我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*。若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。
示例如下:
#测试 shift 命令(x_shift.sh)
1 until [ $# -eq 0 ]
2 do
3 echo "第一个参数为: $1 参数个数为: $#"
4 shift
5 done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1
从上可知 shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位,下面代码用 until 和 shift 命令计算所有命令行参数的和。
exec用法
shell 中的 exec 两种用法:
1.exec 命令 ;命令代替shell程序,命令退出,shell 退出;比如 exec ls
2.exec 文件重定向,可以将文件的重定向就看为是shell程序的文件重定向 比如 exec 5</dev/null;exec 5<&-
=============================
shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。
因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。为了避免这个影响我们的使用,一般将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用点处可以用bash a.sh,(a.sh就是存放该命令的脚本),这样会为a.sh建立一个sub shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。
source命令或者".",不会为脚本新建shell,而只是将脚本包含的命令在当前shell执行。
不过,要注意一个例外,当exec命令来对文件描述符操作的时候,就不会替换shell,而且操作完成后,还会继续执行接下来的命令。
exec 3<&0:这个命令就是将操作符3也指向标准输入。
另外,这个命令还可以作为find命令的一个选项,如下所示:
(1)在当前目录下(包含子目录),查找所有txt文件并找出含有字符串"bin"的行
find ./ -name "*.txt" -exec grep "bin" {} \;
(2)在当前目录下(包含子目录),删除所有txt文件
find ./ -name "*.txt" -exec rm {} \;
ex
ec命令 作用
exec ls 在shell中执行ls,ls结束后不返回原来的shell中了
exec <file 将file中的内容作为exec的标准输入
exec >file 将file中的内容作为标准写出
exec 3<file 将file读入到fd3中
sort <&3 fd3中读入的内容被分类
exec 4>file 将写入fd4中的内容写入file中
ls >&4 Ls将不会有显示,直接写入fd4中了,即上面的file中
exec 5<&4 创建fd4的拷贝fd5
exec 3<&- 关闭fd3
blkid用法
获取磁盘的UUID 可以利用UUID挂载磁盘开机启动 vim /etc/fstab UUID=uuid号码 ...
… … …
tcpdump用法
tcpdump常用命令:
#抓取所有经过 eth0,目的或源地址是 192.168.29.162 的网络数据
命令:tcpdump -n -i eth0 host 192.168.29.162
# 源地址
命令:tcpdump -i eth1 src host 192.168.29.162
# 目的地址
命令:tcpdump -i eth1 dst host 192.168.29.162
#抓取当前服务器eth0网卡端口8080的网络数据
命令:tcpdump -n -i eth0 port 8080
#抓取mysql执行的sql语句
命令:tcpdump -i eth1 -s 0 -l -w - dst port 3306 | strings
#抓取mysql通讯的网络包(cap用wireshark打开)
命令tcpdump -n -nn -tttt -i eth0 -s 65535 'port 3306' -w 20160505mysql.cap
#抓取SMTP 数据
命令:tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
#抓取HTTP GET数据,"GET "的十六进制是 47455420
命令:tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
#抓取SSH返回,"SSH-"的十六进制是 0x5353482D
命令:tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
#实时抓取端口号8080的GET包,然后写入GET.log
命令:tcpdump -i eth0 '((port 8080) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
#抓取指定SYN个数,-c 参数指定抓多少个包。
命令:time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10
core文件的用法
1.Core文件简介
Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。
2.开启或关闭Core文件的生成
关闭或阻止core文件生成:
$ulimit -c 0
打开core文件生成:
$ulimit -c unlimited
检查core文件的选项是否打开:
$ulimit -a
exit用法
用途说明
exit命令用于退出当前shell,在shell脚本中可以终止当前脚本执行
常用参数
格式:exit n
退出。设置退出码为n
格式:exit
退出。退出码不变,即为最后一个命令的退出码
格式:$?
上一个命令的退出码
退出码(exit status或exit code)的约定
0表示成功(Zero - Success)
非0表示失败(Non-Zero - Failure)
2表示用法不当(Incorrect Usage)
127表示命令没有找到(Command Not Found)
126表示不是可执行的(Not an executable)
>=128 信号产生
find用法
Linux中find常见用法示例
find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
#-print 将查找到的文件输出到标准输出
#-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户
例:find . -name .svn | xargs rm -rf
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
xargs用法
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令
xargs的默认命令是echo,空格是默认定界符。 默认替换符号是{}
find . -type f -print | xargs rm {}
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的
-p 参数会提示让你确认是否执行后面的命令,y执行,n不执行
-i xargs要处理的文件如果不是在结尾,需要加上 -i这个参数
-d xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,-d 命令指定分隔符
-e 如果搜索到-e指定的命令行参数,则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部
xargs要处理的文件如果不是在结尾,需要加上 -i这个参数
find . -name "*.log" |xargs -p -i cp {} ../ltesig/
sort 用法
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出
参数列表
- b 忽略每行前面开始出的空格字符
- c 检查文件是否已经按照顺序排序
- d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符
- f 排序时,将小写字母视为大写字母
- i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符
- m 将几个排序好的文件进行合并
- M 将前面3个字母依照月份的缩写进行排序
- n 依照数值的大小排序
- o <输出文件> 将排序后的结果存入指定的文件
- r 以相反的顺序来排序
- t<分隔字符> 指定排序时所用的栏位分隔字符
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位
- --help 显示帮助
- --version 显示版本信息
uniq 用法
报告或删除文件中重复的行
当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用
所以一般与sort连用
-c或--count 在每列旁边显示该行重复出现的次数。
-d或--repeated 仅显示重复出现的行列。
-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
-u或--unique 仅显示出一次的行列。
-w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
--help 显示帮助。
--version 显示版本信息。
head用法
- -n 显示文件的前n行
- -c 显示文件的前n个字节
- -c -n 显示文件除了最后n个字节的其他内容
- -q 隐藏文件名(当指定了多个文件时,在内容的前面会以文件名作为开头)
- -v 显示文件名(默认单个文件不显示,多个文件显示)
netstat用法
-a (all)显示所有选项,netstat默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名(macOS中表示协议 -p protocol)
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计 (重要)
-c 每隔一个固定时间,执行该netstat命令
hexdump用法
查看二进制文件
hexdump file