•cut:显示切割的行数据
–f:选择显示的列
–s:不显示没有分隔符的行
–d:自定义分隔符
例:以“ ”作分割显示第1~3 m列: cut -s -d' ' -f1-3 grep.txt
•sort:排序文件的行
–n:按数值排序
–r:倒序
–t:自定义分隔符
–k:选择排序列
–u:合并相同行
–f:忽略大小写
例:以空格分割,第二行数字排序,倒序:sort -t' ' -k2 -nr sort.txt
•wc:做统计
例计算多少行:wc -l sort.txt
ls -l /etc | wc -l
•sed:行编辑器
–sed [options] 'AddressCommand' file ...
– -n: 静默模式,不再默认显示模式空间中的内容
– -i: 直接修改原文件
– -e SCRIPT -e SCRIPT:可以同时执行多个脚本
– -f /PATH/TO/SED_SCRIPT
– -r: 表示使用扩展正则表达式
行编辑器Command
–d: 删除符合条件的行;
–p: 显示符合条件的行;
–a \string: 在指定的行后面追加新行,内容为string
– \n:可以用于换行
–i \string: 在指定的行前面添加新行,内容为string
–r FILE: 将指定的文件的内容添加至符合条件的行处
–w FILE: 将地址指定的范围内的行另存至指定的文件中;
–s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
•g: 行内全局替换
•i: 忽略字符大小写
•s///: s###, s@@@
• \(\), \1, \2
例:1.在第一行下追加一行“hello,world”:sed -i "1a\hello,world" sort.txt
2..删去hello,world:sed “2d” sort.txt or sed "/hello/d" sort.txt
3.显示带数字的行: sed -n "/[0-9]/p" sort.txt
4.查找并替换(扩大查找的范围已达到精确替换):sed "s/id:[0-6]:initdefault:/id:5:initdefault:/"
inittab or sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab
•行编辑器Address
–可以没有
–给定范围
–查找指定行/str/
•awk
–awk是一个强大的文本分析工具。
–相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
–简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
格式:•awk -F '{pattern + action}' {filenames}
–支持自定义分隔符
–支持正则表达式匹配
–支持自定义变量,数组 a[1] a[tom] map(key)
–支持内置变量
•ARGC 命令行参数个数
•ARGV 命令行参数排列
•ENVIRON 支持队列中系统环境变量的使用
•FILENAME awk浏览的文件名
•FNR 浏览文件的记录数
•FS 设置输入域分隔符,等价于命令行 -F选项
•NF 浏览记录的域的个数
•NR 已读的记录数
•OFS 输出域分隔符
•ORS 输出记录分隔符
•RS 控制记录分隔符
–支持函数
•print、split、substr、sub、gsub
–支持流程控制语句,类C语言
•if、while、do/while、for、break、continue
例:1.输出以:分割的行打印第一列:awk -F':' '{print $1}' passwd
2.只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名: awk -F':' '{print $1 “\t” $7}' passwd
且在所有行开始前添加列名name,shell,在最后一行添加“blue,/bin/nosh”:
awk -F':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print"blue,/bin/nosh"}' passwd
3.搜索/etc/passwd有root关键字的所有行:
awk '/root/ { print $0}' passwd
4.统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容(内置变量:NR,NF):
awk -F':' '{print NR"\t"NF"\t"$0}' passwd
5.用awk做统计:
数据:–Tom 0 2012-12-11 car 3000
–John 1 2013-01-13 bike 1000
–vivi 1 2013-01-18 car 2800
–Tom 0 2013-01-20 car 2500
–John 1 2013-01-28 bike 3500
代码:awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5}} END{for(i in name){print i"\t"name[i]}}' axt.txt
(split($3,date,"-")把第三列已-分割并存入date)
1.用户加入以及密码设置
•useradd cuit01
–passwd cuit01
2.查看用户元数据:id cuit01
3.文件共享(修正属组):
创建目录:mkdir share
创建组:groupadd cuitshare
添加用户到组:usermod -a -G cuitshare cuit01
本来是root持有,让这个组也持有: chown root:cuitshare share
修改权限:基与字符型:chmod ugo +/- rwx share(u用户,g组,o其他人,+加权限,-减权限,r读,w写,x执行,打开)
数值型:(rwx-111一个文件ugo三组权限):chmod 666 cuit01.txt
4.让文件夹被管理员持有:chown -R mysqladmin:root mysql
1)编译安装
–配置文件:Makefile
–编译,安装命令:make
•案例:编译安装nginx
–下载源码
–tar xf 解压
–vi README (看安装步骤)
–./configure:创建Makefile (./configure --prefix=/opt/cuit/nginx)
出现./configure: error: C compiler cc is not found
安装c语言编译器(yum install gcc -y)
出现./configure: error: the HTTP rewrite module requires the PCRE library.
查询pcre:yum search pcre
下载:yum install pcre-devel
出现:./configure: error: SSL modules require the OpenSSL library.
–make:编译
–make install clean 等
•注意:
–编译环境
–软件依赖
–配置项
2)rpm安装
•rpm安装:
–-rpm ivh filename(文件名)
•rpm卸载:
–rpm -e PACKAGE_NAME(包的名称,可以查询得出)
•rpm查询 去
–rpm -qa : 查询已经安装的所有包
–rpm -q PACKAGE_NAME: 查询指定的包是否已经安装
–rpm -qi PACKAGE_NAME: 查询指定包的说明信息
–rpm -ql PACKAGE_NAME: 查询指定包安装后生成的文件列表
–rpm -qc PACEAGE_NEME:查询指定包安装的配置文件
–rpm -qd PACKAGE_NAME: 查询指定包安装的帮助文件
–rpm -q --scripts PACKAGE_NAME: 查询指定包中包含的脚本
–rpm -qf /path/to/somefile: 查询文件是由哪个rpm包安装生成的
–如果某rpm包尚未安装,需查询其说明信息、安装以后会生成的文件
•rpm -qpi /PATH/TO/PACKAGE_FILE
•rpm -qpl
3)yum安装
国内镜像:https://opsx.alibaba.com/mirror
(配置)cd /etc/yum.repos.d/
•repo国内源:
–http://mirrors.aliyun.com
–centos-->help
•before:yum install wget
•....
•repo本地目录源:
–mount /dev/cdrom /mnt
–vi /etc/yum.repos.d/local.repo
–[local]
–baseurl=file:///mnt
–gpgcheck=0
–enable=1
•yum命令:
–yum repolist : 显示出所用仓库
–yum clean all
–yum makecache
–yum update
•查询:
–yum list
–yum search
–yum info
•安装&卸载:
–yum install
–remove|erase
1)自己这个进程执行:source+txt(. +txt):执行文本
不在当前进程执行,子进程执行 :/bin/bash +txt
或在:文件中加#!/bin/bash(脚本本质,还有#!/user/bin/python),输入命令:chmod +x txt,变为可执行,直接./txt执行文件。
2)重定向:cd /proc:进入内核正在运行的进程而抽象成的文件。
cd $$:分配的进程名
cd fd:定向的输出输出流:标准输入流,标准输入流,错误输入流,socket等
可以看到把输入输出流设定bash,格式为: /dev/pts/编号,修改编号即可重定向。
exec 1(输出流)> /dev/pts/定向的编号,即可重定向。
>为重定向符号:如将ls -l显示输入到文件中:ls -l / 1> ls.out
追加到文件中:ls -l/ 1>>ls.out
ls -l /usr /god 1>ls2.out 2>ls3.out(标准输出与报错分开输出到文件)
从左到右执行,ls - l /god /usr 1>ls4.out 2>& 1(or)ls -l /god /usr >& ls5.out (两个输出指到一个文件 )
>输入流,将文本放到标准输入里并赋值,cuit:read cuit 0<<<“txt”(or)read cuit 0< 把文件内容放到流里,cat 0< ooxx.sh •socket案例 exec 8<> /dev/tcp/www.baidu.com/80 echo -e "GET / HTTP/1.0\n" >& 8 cat <& 8 •本地: –当前shell拥有 –生命周期随shell –name=god •局部: –只能local用于函数 –local val=100 •位置: –$1,$2,${11}(用于脚本函数) –$#:位置参数个数 –$*:参数列表,双引号引用为一个字符串 –$@:参数列表,双引号引用为单独的字符串 –$$:当前shell的PID:接收者 •$BASHPID:真实 •管道 –$?:上一个命令退出状态 •0:成功 •other:失败 •引用: –双引号:弱引用,参数扩展 –单引号:强引用,不可嵌套 –花括号扩展不能被引用 –命令执行前删除引用 •命令替换: –反引号:`ls -l /` –$(ls -l /) –可以嵌套 •逻辑判断 –command1 && command2 ls && echo ok(前面一条语句不报错,才执行后面一段语句) –command1 || command2 •算术表达式 –let 算术运算表达式 •let C=$A+$B –$[算术表达式] •C =$[$A+$B] –$((算术表达式)) •C=$(($A+$B)) –expr 算术表达式 •注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用 •C=`expr $A + $B` •条件表达式(返回boolean值) –[ expression ] –test expression –[[ expression ]] 1.–添加用户 –用户密码同用户名 –静默运行脚本 –避免捕获用户接口 –程序自定义输出 创建脚本:vi addUser.sh 脚本编写: #!/bin/bash [ ! $# -eq 1 ] && echo "args error..." && exit 3(判断输入格式是否正确) id $1 &>/dev/null && echo "user exist..." && exit 5(判断用户是否存在) useradd $1 echo $1 | passwd --stdin $1 &> /dev/null(&>/dev/null 静默输出)&& echo “user add ok!” && exit 0 获取执行权限:chmod +x addUser.sh if语句:if ls / &> /dev/null; then echo ok; else echo no ok! ;fi for循环:for((i=0;i<10;i++));do echo $i ; done(and)for i in cuit01 cuit02 cuit03;do echo $i ; done(空格分割可以用双引号合在一起) while循环:while ls /god ; do echo ok ; done 2.–用户给定路径 –输出文件大小最大的文件 –递归子目录 #!/bin/bash oldIFS=$IFS IFS=$'\n'(以空格分割) for i in `du -a $1 | sort -nr`;do(sort已经做了排序) if [ -f $(echo $i | awk '{print $2}') ];then echo $(echo $i | awk '{print $2}') exit 0 fi done IFS=$oldIFS echo "not find..." exit 2 3.•循环遍历文件每一行:流程控制语句 –定义一个计数器num –打印num正好是文件行数 (三种方法) #!/bin/bash oldIFS=$IFS IFS=$'\n' num=0 for i in `cat test.txt`;do echo $i ((num++)) done echo num:$num IFS=$oldIFS num=0 lines=`cat test.txt | wc -l` for((i=1;i<=lines;i++));do head -$i test.txt | tail -1 ((num++)) done echo num:$num exec 8<&0 exec 0< test.txt num=0 while read line;do echo $line ((num++)) done echo num:$num exec 0<&8 9.变量
练习题: