〖Linux〗-- awk、赋值变量、if
【 awk、赋值变量、if】
awk 常用于处理格式非常明显的文件 awk -F: '{print $1}' /etc/passwd 含义:取冒号分隔符的第一段内容 $0 指取所有! NF 指有几段内容 $NF 取最后一段内容 NR 指代行号 用 NR做 行定位 awk -F: 'NR==1{print $1,NR}' test 小于等于3行的内容 awk -F: 'NR<=3{print $1,NR}' test 3-5行的内容awk -F: 'NR>=3 && NR<=5{print $1,"---------",NR}' test 小于等于2行,大于等于7行的内容: awk -F: 'NR>=7 || NR<=2{print $1,"---------",NR}' test nologin结尾的用户名打印出来:awk -F: '/nologin$/{print $1}' test(正则定指,指定文件和打印指定位置) 用户名r开头t结尾,中间任意字符,打印UID,awk -F: '$1~/^r.*t/{print NR ,$3}' test ('$1~/^r.*t/用户名来匹配正则表达式) 只打印指定文件的内容 awk -F: '$1==“root”{print NR ,$1,$3}' test 打印UID大于等于7的用户名 awk -F: '$3>=7{print NR ,$1}' test 自定义一个变量,然后用awk去打印 用到 -v count =7 awk -v x=$count -F: '$3>=x{print NR,$1,$3}' test 其他变量补充 1、 awk 不指定内容,以空格或是多个空格作为分隔符 查看IP地址! ifconfig |awk 'NR==2{print $2}' 取IP地址 可以定义 ip_addr= 'ifconfig |awk 'NR==2{print $2}' echo $ip_addr 打印结果 2、打印处理重复内容 先把重复的行放在一起,然后去重即可。 sort 排序 uniq 去重 -c 查看去了多少行 cat a.txt | sort |uniq -c 3、轻量级的操作 cut cat test |cut -d: -f1,3简单的处理文件 4、du -sh /boot/ 查看文件大小 5、find 命令 (找文件) find / -type f 查找根下的普通文件 find / -name “*.txt”查找文件名为什么的文件 find / -size +30M 大于30M的文件 find / -size +10M size -30M 找出大于10M小于30M的文件 find / -size +2M -type f -name \*.txt 找出根下大于2M的名字中后缀为txt的普通文件。 6、查找某个目录下,包含某个内容文件的文件名全部找出,并打印出来 grep -rl 'root' /test (grep -r 过滤的是目录) 改主机名脚本 vim a.sh read -p 'please input your hostname:' name hostnamectl set-hostname $name 保存退出 给执行权限,chmod -R +x a.sh 执行:./a.sh shell 变量 1、命名规则:以字母开头,剩下的部分可以是:字母,数字,下划线。 规范1.以字母开头 2.使用中划线或者下划线做单词的连接 3.同类型的用数字区分 4.对于文件最好加上拓展名 5.用户能一眼看出要做什么 2、系统变量 set:查看所有变量 env:查看系统变量 3、变量赋值 x=1; 变量赋值 echo $1输出 unset x 删除变量 4、常用系统变量 PATH 环境变量 PWD 当前路径 LANG HOME HISTSIZE 历史命令,最多1000行 PS1 存放当前用户,用于改用户名 PS1=**** IFS 5、全局变量和局部变量 全局变量指所有的用户都通用。 局部变量指仅仅当前用户可用。 export 用于linux中定义全局变量,任何位置都有效 链接: 变量边界问题:用{}来定义变量的边界,括号内是一个整体。 例子:money =10 echo $money ----->10 echo $money0000 没法输出,加上{}即可。 echo ${money}0000 ----->100000 计算内存使用率 free 查看内存 mem_total='free | awk 'NR==2{print $2}'' 总内存 mem_use= 'free | awk 'NR==3{print $3}'' 使用内存 echo $mem_use 查看结果 浮点运算 echo 'scale=2; $mem_use/$mem_total' | bc -l |cut -d. -f2 mem_per=' echo "scale=2; $mem_use/$mem_total" | bc -l |cut -d. -f2' echo ${mem_per}% 百分号的使用率 运算符 注意:用$取值!!! 1、算术运算符 + - * / % 2、关系操作 < > <= >= == !=(不等于) &&(与) ||(或) 用两个小括号,做关系运算(())。 test命令,也可以做关系运算! 中括号[]的语法结构和test一样,用中括号的话,与test连用。整型! 命令下: -gt 大于 -lt 小于 -ge大于等于 -le小于等于 -eq 等于 -ne 不等于 -a 同时成功 -o 仅有一个成功 赋值运算符 = += *= /=(除等于) %=(取余等于) x=1 x=$[$x+1] echo $x=2 ---------> x=1 ((x+=1)) echo $x 2 自增1或是自减1 ((i++)) ((i--)) shell中的所有计算器 $[] (()) $(()) $$ 进程PID $# 总共有多少参数 $? 上一个命令是否正确运行 测试命令:test[] [[]] (()) 1、测试文件状态 -d 目录 -s 文件长度 > 0、非空 -f 正规文件 -w 可写 -r 可读 -x 可执行 -L 符号连接 -u 文件有 suid 位设置 2、字符串测试 = 两个字符串相等 != 两个字符串不相等 -z 空串 -n 非空串 3、测试数值 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 4、扩展测试符号 比较数字,使用(( )) 其他测试使用 [[ ]] 包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 )) 两个文件的比较 FILE1 -ef FILE2 测试两个文件是否是相同的inode 有时为了找到同一个INODE号的文件 更倾向于使用 find 命令的 -inum 或 --samefile FILE1 -nt FILE2 FILE1 is newer (modification date) than FILE2 FILE1 -ot FILE2 FILE1 is older than FILE2 shell 流程控制 创建文件.sh结尾。vim *.sh 编写shell 以什么开始,以什么反着写结束。 给文件执行权限 chmod +x *.sh ./*.sh 执行。验证结果 用户输入 :read -p "please input:" var 睡多少秒(延迟)sleep 0.5 延迟0.5秒 输出用$var var='/etc/passwd' if [ -f $var ] then echo "$" 命名上不要带系统进程名!容易产生新的进程,倒是执行错误。 $1 空格分离的第一个参数 $2空格分离的第二个参数 $3空格分离的第三个参数 $4空格分离的第四个参数 $$ 进程的PID $* 脚本文件后所有参数 $@ 脚本文件后所有参数 $# 总共有多少个参数 $? 上一条命令是否执行成功 应用举例 重启nginx 服务 #!/bin/bash ps aux | grep nginx |grep -v 'grep' #查看进程 if [ $? -ne 0 ] #判断 是否开启 then systemctl start nginx fi
年轻时不多经历一点,老了拿什么下酒.