linux-shell

shell脚本 通过shell命令或程序编程语言编写的shell文本文件,类似dos,含有变量,函数,逻辑控制语句

shell目录 cat /ect/shells bin/sh
bash -默认解析器 bologin -未登录解析 dash csh -c语言风格 tcsh -扩展版

echo $SHELL $SHELL -全局解析

shell编写规范 -建议用.sh结尾 -首行 #!/bin/bash -表示采用bash解析器运行 -单行注释 #注释 -多行注释
:<<! 注释内容 !

例: vim helloworld.sh

#!/bin/bash echo "hello world" :wd

执行shell文件3种方式与区别 1.sh解析器执行方式 sh helloworld.sh sh /root/hellowrld.sh

2.bash解析器执行方式 bash helloworld.sh bash /root/helloworld.sh

3.仅路径解析器执行方式 ./helloworld.sh 注:需要要可执行权限 chmod a+x helloworld -给所有用户添加执行权限x

----多命令处理 例: mkdir /root/abc -创建目录 touch batch.sh -创建建本batch.sh

vim /root/abc/batch -编辑batch.sh

#!/bin/bash touch /root/abc/one.txt -创建one.txt echo "hello shell" >> /root/abc/one.txt -追加内容 :wq

bash /root/abc/one.txt -执行脚本

----变量 -环境变量 变量用于存储管理临时的数据,这些数据都是运行在内存中

变量类型 三种 (系统环境变量 自定义变量 特殊符号变量)

1.系统环境变量  

-系统已定义好的 分为 全局 和 个人 全局
/etc/profile /etc/profile.d/*.sh /etc/bashrc 个人 只针对用户有效 当前用户/.bash_profile 当前用户/.bashrc
查看系统变量命令 env -查看系统变量 set -查看所有的变量

常用系统环境变量 PATH -显示路径 HISTFILE -显示当前用户 执行命令的历史列表 /root/.bash_history LANG -显示语言环境 ZH_CN.UTF-8

2.自定义变量

-用户自已定义的变量 自定义局部 -只能在一个脚本文件中的变量 规则 var_name=value 1.字母,数字,下划线,不能以数字开头 2.=号两侧不能有空格 3.在bash环境中,默认是字符串,无法作运算 4.变量的值如有空格,须用双引号括起来 5.不能使用shell的关键字作为变量名称

查询变量语法 $var_name ${var_name} -可以拼接如:echo my name is ${var_name}123

变量删除 unset var_name

自定义常量 -定义后不能修改 var_name=123 readonly sex

自定义全局 -定当前文件中定义全局变量,这个变量可以在子shell中可以使用 export var_name1 var_name2 例: 创建demo2.sh和demo3.sh
编辑demo2.sh 命令1:定义全局变量var4 命令2:执行demo3.sh vim demo2.sh

#!/bin/bash
var4="abcd"
export var4            --
sh demo3.sh
:wq

编辑demo3.sh 输出var4 vim demo3.sh

 #!/bin/bash
 echo "demo3.sh中输出变量var4,值为:${var4}"

执行demo2.sh -2调用3,是父子关系统

3.特殊符号变量

$n -用于接改脚本文件执行时传入的参数$1-$9表示获取 第输入参数到第9个,第10个以上格式:${数字},$0为当前脚本文件的文件名 例:vim d4.sh

#!/bin/bash echo "当前文件名称:$0" -输出 d4.sh echo "第一个输入参数: $1" -输出 t1 echo "第二个输入参数:$2" -输出 t2 echo "第十个输入参数:${10}" -输出 abcd echo "第十个输入参数:$10" -输出 t10 echo "所有输入参数个数:${#}" -输出 11 echo '直接输出 $:'$ echo '直接输出 $@:'$@ echo '循环遍历输出$' for item in "$" do echo $item done

for item in "$@" do echo $item done :wq 执行: sh d4.sh t1 t2 t3 t4 t5 t6 t7 t8 t9 abcd t11

$# -获取参数的个数 $@ and $ -获取所有输入参数 不用双引号,输出:$1 $2。。。$n $用双引号: “$1 $2...$n” 输出为字符串 $@用双引叼: "$1" "$2"..."$n" 输出为对象

$? -获取 上一个shell命令的退出状态码,或者是函数的返回值 0:成功,非0失败 echo 'hello' echo $? -没错误返回0 abc echo $? -没有abc这个变量,这时会返回状态码127,非0

$$ -用于获取当前shell环境的进程id号 ps -aux |grep bash -显示shell id号 $$ -只显示id号

----深入环境变量 自定义系统环境变量 /etc/profile

开机初始化的时候会加载 全局配置文件 /etc/profile, 改完要重载 -建议变量名全部为大写

创建环境变量步骤: vim /etc/profile export VAR1=VAR1 :wq

重载profile source /etc/profile

echo $VAR1

------加载流程原理介绍 用户进入linux系统就会初始化shell环境 每个脚本文件都有自己的shell环境

shell工作环境分类 交互式 与 非交互式 交互:与用户交互,一个命令返回一个结果 非交互:自已执行,执行多个命令,一并返回结果

登录 与 非登录

环境变量初始化流程 登录: -> 执行/etc/profile -> 执行/etc/profile.d/*.sh -> 执行/当前用户/.bash_profile -> 执行 /当前用户/.bashrc -> 执行 /etc/bashrc全局变量

sh/bash -l/--login 脚本文件 -行加载shell,再执行

非登录:->执行/当前用户/.bashrc -> 执行/etc/bashrc ->执行/etc/profile.d/*.sh

sh/bash 脚本文件 -行执行加载shell非登录环境流程,再执行脚本

vim /etc/profile unset VAR1 -var1先前定义过,要用unset删除

ech $0 -获取shell环境的类型,脚本文件中执行返回当前脚本的文件名 bash -非登录 -bash -登录

以下为登录环境 su 用户名 --login su 用户名 -l

以下为非登录环境 su 用户名

-------shell 字符串变量 字符串的3种格式 单引号 -不能解析变量,拼接无效 双引号 -能解析变量 var3=""\${var2}\"" 不用引号 -也能解析,但不能有空格,空格后面会以命令形式输出

字符串拼接 var1=abc var2=cde var=${var1}${var2} -不能有空格 echo $var3 var3="${var1}${var2}"

shell字符串截取 var1="abcde" echo ${var1:0:2} -从0开始截2个 ab
echo ${var1:3} -截取第3个以后 cde echo ${var1:0-3:2} -从右往前数3个(1开始),载2个,cd echo ${var1:0-4} -从右开始截4个 bcde echo ${var1#c} -从左开始找到第一个c开头的,以该位开始截取后面的所有 de echo ${var1##c} -从左开始找到最后一个c,以此位置开始截取后面的所有 de echo ${var1%c*} -同上从右开始 ab

shell 数组 nums=(29 100 13 52 41 "abc") arr[6]=100 arr2=([1]=10 [10]=11)

获取数据 echo ${nums[1]} -列出第二个 echo ${nums[ ]} -列出所有 echo ${nums[ @ ]} -所有 echo ${#nums[ ]} -数组长度 echo ${#nums[0]} -2 arr3=(${nums[]} ${arr2[]}) -拼接 echo ${arr3}

删除 unset nums[1] unset nums[*]

----- alias 设置别名 type cd type ifconfig type crontab

alias 定义 语法 alias 别名=“命令” alias psl="ps -aux" unalias psl -删除

------ echo 输出字符串 echo -n -不换行 echo "hello \n world" -不换行 echo -e "hello \n world" -换行 echo -e "hello \n world\c" -不换行

------ read 读取控制台输入 read [options] [var var2 ...] read 123 echo $REPLY -输出 123

read name abc echo $name -abc

多个变量赋值 read -p "请输入:" name age hobby echo ${name} echo ${age} echo ${hobby}

读取一个字符 read -p "请输入" -n 1 char -只读取1个字符 或 read -p -n 1 "请输入" char echo printf "\n" echo ${char}

限制时间输入 read -t 20 -sp "请输入" pwd1 echo read -t 20 -sp "请确认" pwd2 print "\n"

if [$pwd1 == $pwd2] then echo "正确" else echo "错误" fi

------ exit 退出 -exit 用于退出当前shell环境结束运行,并返回一个状态码,用$?查看 状态码: 1 表示文件不存在 2 表示文件没有读取权限 3 表示文件类型不对

vim exit.sh

#!/bin/bash echo "hello" exit 2 echo "world" :wq echo $? -2

------ declare 设置变量 作用: 1 declare 设置变量属性 2 查年全部shell变量与函数 3 实现关联数组变量

declare -i age=20 -设置age为整型 age=abc echo $age -显示为:0

declare +i age -取消整型 age=abc echo $age -显示为:abc

declare -r age -设置age为只读 age=123 -报错 “只读变量”

-- key value 关联数组变量 索引数组 vim declare.sh echo "创建索引数组" declare -a array1=(100 abc "aacc") echo "第三个元素: ${array1[2]}" echo

ech "创建关联数组" declare -A array2=(["one"])=100 ["two"]="abc" ["dfd"]="adf") echo "第三个元素:${array2[dfd]}" echo ${array2[@]} :wq

------- 算术运算符 expr expr是evaluate expressions译为"求值表达式", shell expr 队了可实现整数计算,还可 以结合一些选项对字符串进行处理 expr 1 + 1 -返回 2 result='expr 1 + 2' -一定要有空格,3 echo $result

vim operation.sh

#!/bin/bash read -p "请输入第一个数字:"a read -p "请输入第二个数字:"b echo "a=#{a},b=${b}" echo "a+b='expr $a + $b'" echo "a-b='expr $a - $b'" echo "ab='expr $a \ $b'" echo "a/b='expr $a / $b'" echo "a%b='expr $a % $b'" :wq

------- 比较运算符
-eq -是否相等, 是返回0,否1 -ne -是否不相等 不相等返回true -gt -左边是否相等于右边 是0,否1 -lt -左边是否小于右边 是0,否1 -ge -左边是否大于右边
-le -左边是否小于等于右连 0,1 [ 1 -eq 2 ] echo $? -返回1

< -左是否小于右,是0,否1, 以下类推 <= >

>=

!=

(($a<$b)) echo $?

-整数运算符只能比较整数 两个小括号的 整数比较 (()) 和 [] 字符串比较 [] 和 [[]]

----- 字符串比较 运算符 == 或 = -[ $a == $b ] 是为0,否为1,以下类推 != -[ $a != $b ] [[ $a != $b ]] < -[ $a \< $b ] [[ $a < $b ]]

       -[ $a \> $b ]    [[ $a > $b ]]   

-Z -字符串长度是否为0,是返回0,否1[-z$a] -n -字符趾长度是否不为0, 是返回0,否1 [-n"$a"] $ -字符串是否为空,不为空返回true[$a]

-双中括号不需要转义

------ [[]]和[] 区别 word splitting 的发生 单词分隔 [[]] 不会有word splitting 发生 [] 会有word splitting 发生

----- 布尔运算符 ! -非 [ ! 表达式 ] -o -or或 [ 表达式1 -o 表达式2 ] -a -and 与 [ 表达式1 -a 表达式2 ] 格式: [ 1 > 2 -o 1 == 1 ] -必须与[]或者与 test命令结合使用

----- 逻辑运算符 && [[ 表达式1 && 表达式2 ]] || ! 格式: [[ 1 > 2 && 1 == 1 ]] -必须放在[[]]或(())中才有效 ,!可以在[],[[]]中,不可以放在(())

-------------------- 文件类型检测 文件类型介绍: -: -普通文件 d: -目录文件 l: -链接文件 b: -块设备文件 c: -字符设备文件 例: vim file.sh

#!/bin/bash file1="/root/operation1.sh" file2="/root/operation2.sh"

#"测试文件是否可写" if [[ -w $file1 ]] then echo "可写" else echo "不可写' fi

#"测试文件是否可执行" if [[ -x $file1 ]] then echo "可执行" else echo "不可执行' fi :wq

[[ -f $ file1 ]] -是否是普通文件 [[ -s $ file1 ]] -是否是为空

-r -是否可读 -w -是否可写 -x -是否可执行 -s -是否为空 -e -是否存在 -f -是否是普通文件 -d -是否是文件夹 f1 -nt f2 -1是否比2新

--------- shell计算命令 expr命令详解 求值表达式

字符串语法 expr lenth "abcd" 返回:4 expr substr "abcdefgabc" 6 7 -截取第6,7 fg expr index "abcdef" c - 返回位置是3 expr match 字符串 正则表达式 expr match "abcdefgabc" ".d" -匹配到d结束abcd,的长度4,返回4,匹配不到为0 expr 字符串 :正则表达式 expr "abcdefg" : ".d"

----- shell计算命令 (()) 整数 运算 ((a=1+6)) b=$((1+6)) ((a=1+6,b=a-1,c=a+b)) ((a>7 && b==c)) ((a=3+5,b=a+10)) -可以无空格 echo "a=${a},b=${b}"

------ shel计算命令 let命令详解 用于赋值,是最简洁的 let a=1+6 let b=a-1 let c=a+b

let a=1+6 b=a-1 c=a+b

--------- shell计算命令 $[] (()),let命令类似,但只能单个 a=$[1+6] let a=(1+6)

echo "$[1+6],$[a-1],$[a+b]" -返回7,6,13

------总结 expr
优点:可以直接输出 缺点:表达式里引用变量使用$,特殊字符需要转义,只能计算一个表达式

(()) (直接求值推荐) 优点:不需要转义,多个表达式赋值,里面可直接用变量名 缺点:需要获取值后才可以 输出

let (赋值推荐) 优点:赋值简单,不需要转义 缺点:不能直接输出

$[] 优点:不需要转义 缺点:不能多表达式

------- shell计算命令: bc命令 bc 可以进行浮点运算,能进行进制转换计算,可以用+-/ -h -帮助 -v -版本 -l -使用标准数学库 -i -interactive 强制交互 -w -warn,显示 posix的警告信息 -s -standard,使用posix标准来处理 -q -quiet,不显示 欢迎信息 cat task.txt 1+23 3+4 bc -q tasck.txt -返回: 7 7

scale -保留小数 ibase -指定输入默认十进制 obase -指定输出,默认十进制 last -获取最近的计算结果

作用 互动: bc -q 1_1 2

scale=2;10/3 3.33

last 3.33

obase=2;7 111

---bc shell 中非互动式的管道运算 echo "expression" | bc [options] expression 表达式必须复合bc命令要求的公式 expression 表达式里面可以引用shell变量

echo "1+1" | bc echo "10/3" | bc echo "scale=2;10/3" | bc echo "e(2)" | bc -l echo "b=$a+2;b" | bc

将bc计算结果赋值给shell变量 两种方式 var_name='echo "expression" | bc [options]' var_name=$(echo "expression" |bc [options] ) '' 所有的linux都支持,但是容易混淆 $() 不是所有的linux都支持 b='echo "1+1" | bc' b=$(echo "1+2" | bc) ----shell中 非互动式的 输入重定向运算 bc [options] << EOF 可以多行输入表达式 第一种方式 var_name='bc << EOF 表达式1 表达式2 EOF '

var_name=$(bc << EOF 表达式1 表达式2 EOF )

b='bc -l << EOF 1+1 2+2

3+3 EOF ' echo $b -返回 2 4 6

b=$(bc -l << EOF

scale=2;10/3 EOF ) echo $b -返回3.33

--------- 流程控制语句 if else if 条件 then 命令 elif 命令 elif 命令 else 命令 fi 例:

#!/bin/bash read -p "请输入成绩" score if ((score<60)) then echo "不及格" elif ((score>60 && score<70)) then echo "及格" elif ((score>70 && score<100)) echo "良好" else ((score>100)) echo "输入错误" fi :wq

单行操作 if ((1==1)); then echo "成立";else echo "不成立";fi;

------ 退出状态 vim test.sh

#!/bin/bash read -p "请输入文件全名" filename read -p "请输入文件内容" data if [ -w $filename -a -n $data ] then echo $data > $filename
echo "文件写入成功" else echo "文件写入失败" fi :wq sh test.sh

------ test命令 1.整数比较测试 test 整数1 options 整数2 options: lt le gt ge eq ne

2.字符串比较测试 test 变量1 options 变量2 options: < > != == <>需要转义

3.文件测试 test options 文件路径字符串 options: -w r -e -x -s -d

注:test命令与[]功能一样

test 1 -eq 1;echo $? -返回0 test 1 -lt 2;echo $? test "a" > "b";echo $? -1 test -z "b";echo $? test -e /root/abc.txt;echo $?
test -w /root/abc.txt;echo $? -判断文件是否可写,0或1 test 1 -eq 1 -a 1 > 2;echo $?

-------- 流程控制 case语句 case 值 in 匹配模式1) 命令1 命令2 ;; 匹配模式2) 命令1 命令2 ;; esac 例:

#!/etc/base read -p "请输入一个0-7的数字" number case $number in 1) echo "星期一" ;; 2) echo "星期二" ;; 3) echo "星期三" ;; 4) echo "星期四" ;; 7|0) echo "星期日" ;; *) echo "输入无效" ;; esac :wq

---- while 循环语句 while 条件 do 命令1 命令2 ... continue break; done

一行写法 while 条件; do 命令; done;

例 read -p "请输入一个数字" number i=0 while ((i<number)) do echo "hello${i}" let i++ if ((i==3)) then echo "退出" continue; fi done

无限循环 while :;do echo "hello";done

------ until 语句 until 条件 do 命令 done

until [[ ! i<5 ]] do
let i++ echo "hello${i}" done

------ for 循环语句 for var in item1 item2 ...itemN do 命令1 命令2 。。。 done

一行 for var in itemN;do ;done

例: for i in 1 3 56 -枚举 do echo "hllo${i}" done

for i in {1..10} -1到10

for ((i=1;i<=10;i++));do echo "hllo${i};done"

--------- select语句 select var in menu1 menu2 ... do
令 done -只有遇到break或ctrl+d才会结束

select hobby in "编程" “游戏” “篮球” do echo $hobby break done echo ${hobby} -前面会显示编号

--------- basename 系统函数 basename [string / pathname] [suffix] basename /root/test1.sh -返回test1.sh basename /root/test1.sh .sh -返回test1,去后缀

--- dirname 系统函数 dirname /root/test1.sh -返回/root dirname ./test.sh -返回.

------- shell函数 自定义函数 [ function ] funname () { 命令 [return 返回值] -【】内可不加 }

funname 函数名

#!/bin/bash demo() { echo "调用函数" } :wq demo()

sum() { echo "求2个数的和" read -p "请输入第一个数字" n1 read -p "请输入第二个数字" n2 echo "两个数字分别为$n1和$n2" return $(($n1+$n2)) } :wq sum echo "两个数的和为:$?"

----- 有参函数

#!/bin/bash funParam() { echo "第一个参数为:$1 !" echo "第二个参数为:$2 !" echo "第十个参数为:${10} !" echo "参数总数有 $# 个!" echo "获取所有参数:$* !" } :wq funParam 1 23 4 5 6 7 8 9 10 14 15

-----shell重定向 stdin -standard input 0 获取键盘输入 stdout -standard out 1 将正确数据显示 stderr -standard err 2 将错误信息显示

输入,输出 重定向 重定向的作用 > <

> 命令 file2 命令 fd> file 命令 fd>> filej 命令 >file fd1>&fd2 <<tag

echo "hello" > log.txt echo "hello" >> log.txt ll abaa 2>> log.txt -错误消息 ll abcsd >> log.txt 2>&1 -正确,错误都输出

------ wc 命令 -c - -w -统计单词 -l -统计行数 wc -l

------ cut命令 cat cutl.txt | grep abcefg | cut -d " " -f 2

-f -提取范围 -d -自定义分隔符 -c -以字符为单位进行分割 -b -提取范围 -n -与-b连用,不分割多字节字符

例 切割进程id ps -aux |grep bash | head -n 1 | cut -d " " -f 8 - 定义以空格分割,提取范围,显示第8段

切割ip ifconfig |grep |grep broadcast | cut -d " " -f 10

-------- sed命令 stream editor 流编辑器 编辑文件中的单词 编写在文件中插入或修改行 使用sed作为过滤器来过滤管道数据命令

sed[选项参数] [模式匹配/sed程序命令] [文件名]

选项参数 -e
-i 对内容进行修改,不加不对文件进行修改 -f -n 获取匹配的行 -r ruguler

程序命令 a 增加 c 修改替换 d 删除 i 插入 p 打印 s 替换一行 = n

特殊符号

例 sed.txt abc ddd ccc 123 ccc 123 abc

set -i '3ahello' sed.txt -第三行后面添加第四行hello,-i不加不修改原文件 sed -i '3ihello' sed.txt -第三行前面插入,hello在第三行 sed -i '/ccc/ihello' sed.txt -所有ccc前面一行插入hello sed '2d' sed.txt -删除第二行 sed '1~3d' sed.txt -每隔三行删一行 sed '1,3d' sed.txt -第除一到三行 sed '1,3!d' sed.txt -只保留一到三行 sed '$d' sed.txt -删除最后一行
sed '/cc/d' sed.txt -删除含有cc的行 sed '/cc/,$d' sed.txt -删除匹配行到最后一行,包括匹配行 sed '/cc/,+1d' sed.txt -删除匹配行和后面一行 sed '/cc|12/!d' sed.txt -不含有cc或12的行都删除

sed '1chello' sed.txt -修改第一行为hello sed '/cc/chello' sed.txt -包含有cc的行修改为 hello
sed '$chello' sed.txt -最后一行修改为hello sed 's/cc/hello/' sed.txt -替换第一个cc的为hello,上例改完为'helloc' sed 's/cc/hello/2' sed.txt -替换第二个cc的为hello

sed 's/cc/ab/w sed2.txt' sed.txt -替换第一个cc的为hello,并把这一行写入到sed2.xtx

sed -n 's/cc/ab/2pw sed2.txt' sed.txt -替换第二个cc的为hello,并把这一行写入到sed2.xtx,在当前打印出匹配到的这一行 -n是获取这一行,p是打印

sed '/a/s/b.*//' sed.txt -找到所有含有a的行,s是替换掉从b开始及后面的所有为空 该例显示为a, 如果如上一例加-n和p将显示到匹配到的这一行

sed 's/$/& test' sed.txt -每行的末尾添加test,s替换末尾的位置 查 ps -aux | sed -n '/ssdh/p' -查询含有ssdh的行 sed -e '1d' -e 's/ccc/123/g' sed.txt -第一行删除,并将ccc替换为123 或 sed '1d;s/ccc/123/g' sed.txt -分号分隔两个命令

sed高级用法,缓存区数据交换 1.sed是逐行处理的,即读取一行处理一行,输出一行 2.sed打文件读出来第一行存放的空间叫模式空间,会在该空间中对读到的内容做相应处理 3.sed还有一个额外的暂存空间,里面只有空行 4.sed可使用相应的命令从模式空间往暂存空间放入内容,或从暂存放入模式空间 h 模式空间里的内容复制到暂存空间 覆盖方式 H 模式空间里的内容复制到暂存空间 追加方式 g 暂存复制到模式 覆盖方式 G 模式复制到暂存 追加方式 x 交换2个空间的内容

sed '1h;$G' sed.txt -将第一行放在暂存空间,再把暂存数据追加到最后一行 sed '1{h;d};$G' sed.txt -将第一行放暂存并删除,再把暂存数据追加到最后一行 sed '1h,2,$g' sed.txt -第一行数据放入暂存,从第2行开始到最后,用暂存数据覆盖替换 sed '1,3H;$G' sed.txt -将前3行数据复制粘贴到最后一行 sed 'G' sed.txt -暂存空间都有一个空行 sed -i '^$/d' sed.txt -删除空行

-------------------- awk awk是一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,打开的部分再进行各种分析处理,因为切开的部分使用awk可以定义变量,运算符,使用流程控制语句进行深度加工与分析 awk [options] 'pattern{action}' {filenames}

-F 自定义分隔符 -V

awk内置变量 ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符 NF 列数 NR 行数 OFS 输出记录分隔符 ORS 输出记录分隔符 RS 控制记录分隔符 $n $0变量是指整条记录 $NF 总数

准备文件 cp /etc/passwd ./ echo "abc 123 456" | awk '{print $1"&"$2"&"$3}' -打印出abc&123&456 awk '/root/{print $0}' passwd -匹配root,打印含有root的行 awk -F ":" '/root/{print $7}' passwd -以:号分隔列,打印第7列 awk -F: '{print "文件名:"FILENAME",行号:"NR",列数:"NF",内容:"$0"}' -打印出定义属性 上例 也可用 拼接字符串: printf %s是字符占位符 awk -F: '{printf ("文件名:%s,行号:%s,列数:%s,内容:%s\n",FILENAME,NR,NF,$0)}'

awk -F ":" 'NR==2{printf("filename:%s,内容:%s",FILENAME,$0)}' passwd

ls -a |awk '/^c/' -打印以c开头的

awk -F: '{print $1}' passwd -打印每行第一列 awk -F: '{print $NF}' passwd -打印每行最后一列 awk -F: '{print $(NF-1)}' passwd -打印每行倒数第二列

=10 && NR<=20){print $1}}' -打印第10-20行的第一列>

echo "one:two/three" | awk -F "[:/]" {print $1"&"s2"&"s3} -:或/分隔 多分隔符

echo -e "abc\nabc"| awk '{print $0}' -两行数据n是换行,打印每一行数据 echo -e "abc\nabc"| awk 'BEGIN{print "开始..."}{print $0}END{print "结束..."}' -在开头插入字符串开始..结尾插入结束

echo "abc sdfsdfsfd lkjlk"|awk '{print $1"&"$2"&"$3}' -abc&sdfsdfsfd&lkjlk < echo "abc sdfsdfsfd lkjlk"|awk -V str="" '{for(n=1;n<=NF;n++){str=str$n}} END{print str}' -abc&sdfsdfsfd&lkjlk -利用循环拼接 >

echo "2.1" | awk -v i=1 '{print $0+1}' -3.1

ifconfig | awk '/broadcast/{print $0}' | awk '{print $2}' sed 'G' sed.txt -插入空行

sed 'G' sed.txt |awk '/^$/{print NR}' -打印空行行号

小结: grep,sed,awk,cut grep: 用于查找匹配行 cut: 截取字符串,不适合截取有多个空白字符的字段 sed: 增删改查数据 .sed用于在文件中截取数据进行增,删,改,查 awk: 截取分析数据,可以在某个文件中以竖列来截取分析数据,可以处理有多个空格的字段

------- sort 排序 sort -t " " -k2n,2 -uk1,2 -o sort2.txt sort.txt -对第二列按照数字进行升序,-t是分隔符,-u是去重,k1,2对1,2列排序,-o保存到sort.txt和sort.txt

sort -t "," -k1,1 -k2nr,3 sort3.xtx -第1列进行升序,-k是排序,n是数字,r是降序,第2,3列进行降序

------------------------------ 面试题 查询file1.txt中的空行所在的行号 vim file1.txt awk '/^$/{print NR}' file1.txt

求一列的和 vim file2.txt 张三 20 李四 30 awk '{sum+=$2} END{print "求和:"sum}' file2.txt

检查文件是否存在 if [ -e /root/file1.txt ];then echo "文件存在";else echo "文件不存在";fi

数字排序 vim file3.txt sort -n file3.txt |awk '{sum+=$1;print $} END{ print "求和:"sum}'

搜索指定目录下文件内容 grep -r "123" /root | cut -d ":" -f 1 | sort -u

批量生成文件名 < read -t 30 -p "请输入创建文件的数目:"n test=$(echo $n | sed 's/[0-9]//g') if [ -n "$n" -a -z "$test" ] then for ((i=0;i<$n;i+1)) do name=$(date +%N) [ ! -d ./temp ] && mkdir -p ./temp touch "./temp/$name" echo "创建 $name 成功" done else echo "创建失败" exit 1
fi

>

批量改名 filenames=$(ls /root/temp) number=1 for name in $filenames do print "重命名前:%s" ${name} newname=${name}"-"${number} rename ${name} ${newname} /root/temp/* let number++ printf "重命名后:%s\n" ${newname} done

批量创建用户 echo "123456" | passwd --stdin 用户名 vim adduser.txt ULIST=$( cat /root/users.txt) for UNAME in $ULIST do useradd $UNAME echo "123456" | passwd --stdin $UNAME $>dev/null [ $? -eq 0 ] && echo "$[UNAME]用户名与密码初始化成功" done

筛选单词 echo "i may not be able to change the past" |awk -F "[,.]" '{for(i=1;i<=NF;i++){if(length($i)>3){print $i}}}'

< 单词一及字母去重排序 awk -F "[ ,. ]" '{for(i=1;i<=NF;i++){S[$i]++}} END{for(key in S)print S[key],key}' file8.txt |sort -rn | head

扫描内存活的主机 ping 192.168.56.1 -c 2 | awk 'NR==6{print $4}' 2 vim file9.sh

#!/bin/bash count=0 for i in 192.168.56.{1..254} do receive=$(ping $i -c 2 | awk 'NR==6{print $4}') if [ $receive -gt 0 ] then echo "$[i] 在线" let count++ else echo "${i}不在线" fi done

mysql 分库存备份

#!/bin/bash user=root pass=root backfile=/root/mysql/backup [ ! -d $backfile ] && mkdir -p $backfile cmd="mysql -u${user} -p${pass}" dump="mysqldump -u$user -p$pass" dblist=$cmd-e "show databases;" 2>/dev/null | sed 1d || egrep -v '_schema|mysql' echo "需要备份的数据库存列表" echo $dblist echo "开始备份" for db_name in $dblist do printf '正在备份数据库存:%s' ${db_name} $dump ${db_name} 2>/dev/null |gzip > ${backfile}/${dbname}$(date +%m%d).sql.gz print ",备份完成\n" done echo "全部备份完成"

mysql 数据库存分库分表备份

user=root

pass=root backfile=/root/mysql/backup [ ! -d $backfile ] && mkdir -p $backfile cmd="mysql -u${user} -p${pass}" dump="mysqldump -u$user -p$pass" dblist=$cmd-e "show databases;" 2>/dev/null | sed 1d || egrep -v '_schema|mysql' echo "需要备份的数据库存列表" echo $dblist echo "开始备份" for db_name in $dblist do printf '正在备份数据库存:%s' ${db_name} tables=mysql -u$user -p$pass -e"use $db_name;show tables;" 2>/dev/null|sed 1d for j in $tables do printf '正在备份数据库存 %s 表%s' ${db_name} ${j} $dump -B --databases $db_name --tables $j 2>/dev/null > ${backfile}/${db_name}-${j}-${j}-date+%m%d.sql print ",备份完成\n" done echo "全部备份完成"

JS
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。