13_linux笔记-shell文本处理命令

  • 练习1 脚本 编写一个脚本,实现如下功能
    • 示例1
    • 示例2:if 语法
    • 补充:&&可以连接2个命令
  • 知识点2 变量 全局/局部
    • 示例1:local 局部变量
    • 示例2:默认全局变量
  • 知识点3 Python定义的变量 默认局部变量
    • 示例1:global a 全局变量
    • 示例2:默认局部变量 只能在函数体内使用的变量
  • 知识点4 shell函数里传参(位置变量)
    • 示例
  • 知识点4.2 python里传参
    • 示例:python里传参
  • 知识点5 test判断 等同于[]
    • 示例:test
  • 知识点6 判断方式 [] [[]] (()) test
    • 示例:test
  • 知识点7 连接运算
    • 示例
  • 知识点8 函数
    • 示例
    • 示例:位置参数传参
  • 知识点9 seq命令
    • 示例1:[start] [step] end
    • 示例2:# seq 2 5 # seq -w 9 12
    • 示例3:获取/etc/passwd最后一行,赋给一个变量
    • 示例4:seq命令 类似于 python中的range函数
    • 示例5:-s:指定分隔符
  • 练习10 创建用户(3次重试机会)脚本
    • 示例:seq命令 创建失败 重试
  • 知识点11 循环获取文件或者命令输出的内容(3种)
    • 示例1:重定向 while read a b c ; < a.txt
    • 示例2:管道符号 cat a.txt | while read a b c
    • 示例3:for 循环实现(注:使用for循环去做,不太好)
    • 示例3.2:i代表文件的每一项,以空白分割
  • 练习12
    • 示例
      • 步骤1:首先过滤出ZF所在的行
      • 步骤2:套个循环
  • 总结13 循环获取文件或者命令输出的内容
  • 知识点14 shell中的一维数组
  • 示例14.1:定义、索取
  • 示例14.2:获取一位数组长度(元素个数)
  • 示例14.3:获取字符串长度 echo ${#b}
  • 示例14.4:修改/删除 元素
  • 知识点15 linux里 生成随机数
    • 示例
  • 知识点15.2 生成指定范围内的随机数
    • 示例1:产生10以内的随机数(不含10)
  • 练习16
    • 示例
  • 知识点17 产生5--10之间随机数
    • 产生5--10之间随机数
    • 50--150之间随机数
    • 150-200之间随机数
  • 知识点18 tr命令(替换命令)
    • 示例1:替换
    • 示例2:删除 # echo 123456| tr -d 34
    • 示例3:tr -s 压缩相同字符
    • 练习4:把环境变量里 : 替换成空格
    • 示例5:将/etc/passwd里的 :替换成空格
      • 写法1:cat导入
      • 写法2:tr接收标准输入 重定向标准输入 tr ":" " "
    • 扩展5.1 重定向标准输入

博客cpen_web

练习1 脚本 编写一个脚本,实现如下功能

#====================
1.增加用户并设置密码
2.删除用户
3.查看用户
4.退出
#====================
输入的指定不是1-4,给提示给予提醒,并且如果不输入退出的话,可以循环添加。
按1 增加用户,并且设置密码 useradd passwd
按2 删除用户 userdel -r
按3 查看用户 id
按4 退出 exit

示例1

menu(){                                  #(注:函数)
echo "===================="
echo "1.增加用户并增加密码"
echo "2.删除用户"
echo "3.查看用户"
echo "4.退出"
echo "===================="
read -p "请选择您所需要的服务:" ser
}
create_user(){                           #(注:函数)read -p "创建用户名:" user1id $user1 &>/dev/null && echo "用户已存在!" && return    #(注:退出函数,接return)useradd $user1 &>/dev/null              #(注:导入黑洞文件)id $user1 &>/dev/null || return  #(注:用户已存在 用Id 判断比较好。返回值非0可能是命令执行错误)read -s -p "设置密码:" passwd1          #(注:-s密码隐藏)echo $passwd1|passwd $user1 --stdin &>/dev/null
}
while :
do
menu                #(注:调用函数)
case $ser in
1)clear         #(注:清空屏幕)create_user;;
2)
# ……………………………………
4)
echo “退出!”exit
;;
*)                          #(注:表示其他的所有选项,从上至下依次匹配)
echo “请输入1-4!”
esac
done

示例2:if 语法

    if ["$options"==1]||["$options"==2]||["$options"==3]||["$options"==4]thencase $options in1)read -p "请输入用户名:" usernameif id $username &>/dev/nullthenecho "$username is exist!"elseread -s -p "请设置密码:" passworduseradd $username &>/dev/nullecho $password | $username --stdin &>/dev/nullecho -e "\n create $username ok!"fi ;;
# ……………………………………………………4)echo "退出!"exitesacelseecho "请输入数字1或2或3或4!"fi

补充:&&可以连接2个命令

&&可以连接2个命令

[root@sanchuang-linux ~]# id chen222
uid=1017(chen222) gid=1017(chen222) 组=1017(chen222)
[root@sanchuang-linux ~]# id chen222 && echo "chen222存在"
uid=1017(chen222) gid=1017(chen222) 组=1017(chen222)
chen222存在
[root@sanchuang-linux ~]# id chen222 &>/dev/null && echo "chen222存在"
chen222存在

#注:用户已存在 用id 判断比较好。返回值非0可能是命令执行错误

知识点2 变量 全局/局部

Shell中定义的变量 默认全局变量
local a=10 局部变量

示例1:local 局部变量

func01(){local a=10
}func01                             #(注:调用函数)
echo $a
[root@sanchuang-linux chenpeng]# sh aaa.sh #(注:为空。局部变量)

示例2:默认全局变量

func01(){a=10
}func01                             #(注:调用函数)
echo $a
[root@sanchuang-linux chenpeng]# sh aaa.sh
10                                  #(注:全局变量)

知识点3 Python定义的变量 默认局部变量

Python定义的变量 默认局部变量
global a 全局变量

示例1:global a 全局变量

def func01():global a                #(注:全局变量)
a = 10func01()
print(a)
[root@sanchuang-linux ~]# python3 python_hanshu.py
10

示例2:默认局部变量 只能在函数体内使用的变量

def func01():
a = 10func01()
print(a)[root@sanchuang-linux ~]# python3 python_hanshu.py
Traceback (most recent call last):File "python_hanshu.py", line 5, in <module>print(a)
NameError: name 'a' is not defined                #(注:局部变量)

知识点4 shell函数里传参(位置变量)

示例

Shell里传参

func01(){a=100echo "$1 $2 $3"                     #(注:函数的参数 [位置变量])
}
func01 第一个参数 第二个参数 第三个参数        #(注:调用参数)
echo $a

知识点4.2 python里传参

示例:python里传参

def func01(x,y):global aa = 10func01(1,2)
print(a)

知识点5 test判断 等同于[]

示例:test

[root@sanchuang-linux chenpeng]# a=123
[root@sanchuang-linux chenpeng]# b=123
[root@sanchuang-linux chenpeng]# test a==b
[root@sanchuang-linux chenpeng]# test a==b && echo ok
ok

知识点6 判断方式 [] [[]] (()) test

·(( )) 判断数字 > < == !=
·[[ ]] 判断字符串 或者 -eq -ne -gt -lt 判断数字
·有些语法 [ ] 是不支持的,建议使用[[ ]]
·test(测试)判断,等同于1个中括号

示例:test

[root@sanchuang-linux ~]# a=123
[root@sanchuang-linux ~]# b=123
[root@sanchuang-linux ~]# test a==b && echo ok
ok
[root@sanchuang-linux ~]# test a==b && echo ok || echo error
ok

知识点7 连接运算

使用分号(;)实现一行中写多条语句

示例

[root@sanchuang-linux chenpeng]# echo "abc";echo "xyz"
abc
xyz

知识点8 函数

函数的定义/使用

示例

add(){echo “两数相加为:$(( $num1 + $num2 ))”
}
Add

函数的传参

示例:位置参数传参

func01(){a=100echo "$1 $2 $3"
}func01 第一个参数 第二个参数 第三个参数
echo $a

·函数内的变量定义 默认为全局变量
·使用local关键字 可以转换为局部变量

知识点9 seq命令

seq命令 类似于 python中的range函数
用途:打印出一串有序的数字
格式:seq [选项] 数字范围
-s:指定分隔符
-w:指定同等宽带输出

数字范围的展示:
[start] [step] end
start 和 step 都是选填的
step 为正,表示从小到大输出
step 为负,表示从大到小输出

示例1:[start] [step] end

[root@sanchuang-linux ~]# seq 3 -1 1            # 注:中间是步长。左右是起始位置
3
2
1
[root@sanchuang-linux ~]# seq 1 2 6
1
3
5
[root@sanchuang-linux ~]# seq 1 -2 6           # 注:步长为负数时,从1到6没有输出
[root@sanchuang-linux ~]# seq 6 -2 1
6
4
2

示例2:# seq 2 5 # seq -w 9 12

[root@sanchuang-linux ~]# seq 2 5
2
3
4
5
[root@localhost ~]# seq -w 9 12            # -w 指定同等宽度输出
09
10
11
12

补充 获取命令的返回结果
·使用反引号 ``
·或者 $()

示例3:获取/etc/passwd最后一行,赋给一个变量

[root@sanchuang-linux ~]# tail -n1 /etc/passwd              # 注:获取最后一行 # tail -n1
wtc:x:1029:1029::/home/wtc:/bin/bash
[root@sanchuang-linux ~]# line=`tail -n1 /etc/passwd`       # 注:方法1
[root@sanchuang-linux ~]# echo $line
wtc:x:1029:1029::/home/wtc:/bin/bash
[root@sanchuang-linux ~]# line1=$(tail -n1 /etc/passwd)       # 注:方法2
[root@sanchuang-linux ~]# echo $line1
wtc:x:1029:1029::/home/wtc:/bin/bash

示例4:seq命令 类似于 python中的range函数

[root@sanchuang-linux ~]# vim seq_test.sh
for i in `seq 2 10`       # 注:反引号 执行这个命令,获取命令的返回值
do                      # 注:seq 2 10 包括2,包括10echo $i
done
for i in $(seq 2 10)     # 注:也表示执行这个命令,获取命令的返回值
doecho $i
done
[root@sanchuang-linux ~]# bash seq_test.sh
2
3
4
5
6
7
8
9
10

示例5:-s:指定分隔符

[root@sanchuang-linux ~]# seq -s "+" 10          # -s:指定分隔符
1+2+3+4+5+6+7+8+9+10                           # 注:不搞开头,默认情况下 从1开始,到10
[root@sanchuang-linux ~]# seq 10                   #注:默认情况下 连接符是 换行符
1
2
3
4
5
6
7
8
9
10

练习10 创建用户(3次重试机会)脚本

示例:seq命令 创建失败 重试

[root@sanchuang-linux ~]# vim user_add.sh
#!/bin/bash
# 增加                                # 注:用户增加的部分
add(){for i in `seq 3 -1 1`               # 注:seq 命令类似于pythonrange函数 3 2 1doecho "增加用户"read -p "请输入用户名:" usernameid $username &>/dev/null && echo "用户已存在,还有$(( $i - 1))次机会" && continue#if id $username &>/dev/null #then#     echo "用户已存在,还有$(( $i -1 ))次机会"#     continue#fi  #useradd $username &>/dev/null && echo "创建成功!" && echo $password | passwd $username --stdin &>/dev/null && break || echo -e "\n创建失败!"if useradd $username &>/dev/nullthenecho "创建${username}成功!"read -s -p "请设置密码:" passwordecho $password | passwd $username --stdin &>/dev/nullbreakelseecho "创建失败!,还有$(($i-1))次机会!"fidone
}
# 删除
del(){echo "删除用户"read -p "请输入用户名:" usernameuserdel -r $username &>/dev/null && echo "删除成功!" || echo "用户不存在,删除失败!"
}
# 查看
seek(){echo "查看用户"read -p "请输入用户名:" usernameid $username
}
echo "#############################"
echo "按1  增加用户,并且设置密码"
echo "按2  删除用户"
echo "按3  查看用户"
echo "按4  退出"
echo "#############################"
while :
doread -p "请输入你的选择:" optionscase $options in1)add;;2)del;;3)seek;;4)echo "退出!"exit;;*)echo "请输入指定内容 1-4!"esac
done

知识点11 循环获取文件或者命令输出的内容(3种)

示例1:重定向 while read a b c ; < a.txt

#!/bin/bash
while read a b c
doecho "name is $a, sex is $b, age is $c "
done < a.txt                 # 注:当前路径下的文件。可以接绝对路径

示例2:管道符号 cat a.txt | while read a b c

cat a.txt | while read a b c
do echo "name is $a, sex is $b, age is $c "
done

示例3:for 循环实现(注:使用for循环去做,不太好)

#for循环默认以空白(空格/回车 制表符)分割

echo "for 循环实现..........."
for i in `ls`                 # i 代表空白输出的每个文件
doecho $i
done

示例3.2:i代表文件的每一项,以空白分割

[root@sanchuang-linux ~]# vim file_test.sh
for i in `cat a.txt`
doecho $i
done
[root@sanchuang-linux ~]# bash file_test.sh
wenyao
f
18
chenpeng
m
19
wtc
f
17
[root@sanchuang-linux ~]# cat a.txt
wenyao f 18
chenpeng m 19
wtc f 17

示例3.3:for i in ls -al # i代表当前目录下详细信息,i代表以空白分割的每一项

练习12

找出list.xml中主机为ZF的行然后循环输出ip与区服对应的关系

示例

[root@sanchuang-linux ~]# cat list.xml
####IP    主机名    区服#########
127.0.0.1 ZF-1      1 33 49 57
127.0.0.1 ZF-11     65 67 69
127.0.0.1 HF-1      22 34 6
127.0.0.1 HF-11     6 17 36
127.0.0.1 ZF-12     1 2
127.0.0.1 HF-1      34 7

步骤1:首先过滤出ZF所在的行

[root@sanchuang-linux ~]# vim test6.sh
#!/bin/bash                                 # 管道| 把输出 作为下一条命令的输入
cat list.xml |grep ZF |while read ip host qufu      # 首先过滤出ZF所在的行
do                                          # while read 获取内容echo "ip:$ip, qufu:$qufu"                    # 注:参数3整个赋给$qufu
done
[root@sanchuang-linux ~]# cat list.xml | grep ZF
127.0.0.1 ZF-1      1 33 49 57
127.0.0.1 ZF-11     65 67 69
127.0.0.1 ZF-12     1 2
[root@sanchuang-linux ~]# sh test6.sh          # 注:$ip  $host  $qufu  不一定需要对应
ip:127.0.0.1, qufu:1 33 49 57                   # 前两个对应的,把前两个都取了
ip:127.0.0.1, qufu:65 67 69                     # 后面有的话,就全部是后面的内容
ip:127.0.0.1, qufu:1 2                          # 没有的话就为空(取不到的话就为空)

步骤2:套个循环

#!/bin/bash
cat list.xml |grep ZF |while read ip host qufu
dofor i in $qufu                                # 注:套个循环。for循环以空格进行分割doecho "ip:$ip, qufu:$i"                  # 注:这里是i。对区服进行循环done
done
[root@sanchuang-linux ~]# sh test6.sh
ip:127.0.0.1, qufu:1
ip:127.0.0.1, qufu:33
ip:127.0.0.1, qufu:49
ip:127.0.0.1, qufu:57
ip:127.0.0.1, qufu:65
ip:127.0.0.1, qufu:67
ip:127.0.0.1, qufu:69
ip:127.0.0.1, qufu:1
ip:127.0.0.1, qufu:2

总结13 循环获取文件或者命令输出的内容

·for i in 默认 以空白分割 循环获取每个元素
·while read 每次获取整行
while read的参数 可以接任意个,默认还是以空白分割
如果参数没有对应获取的值,那参数就为空
如果文件中空白分割的参数大于read接受的参数,那多出的参数都会赋给最后一个read接受的参数

管道 进制之间通信的一种方式

知识点14 shell中的一维数组

shell中的一维数组 使用
定义:使用圆括号,中间以 空格 作为分隔符
博客连接:https://www.cnblogs.com/tangshengwei/p/5446315.html

示例14.1:定义、索取

[root@sanchuang-linux ~]# a=(xx yy zz)     # 注:a 是一个数组
[root@sanchuang-linux ~]# a=(xx yy zz ff)     # 注:a 是一个数组
[root@sanchuang-linux ~]# echo ${a[0]}     # 注:通过索引查找,下标从0开始
xx
[root@sanchuang-linux ~]# echo ${a[1]}     # 注:通过索引查找
yy
[root@sanchuang-linux ~]# echo ${a[3]}
ff
[root@sanchuang-linux ~]# echo ${a[@]}        # 注:${a[@]} 表示它里面的每一个数,@ 取它里面的全部值
xx yy zz ff                             # 注:$@ 参数列表里面的全部内容
[root@sanchuang-linux ~]# echo ${a[@]:1:4}    # 注:索取(切片)
yy zz ff
[root@sanchuang-linux ~]# a=(xx yy zz ff)
[root@sanchuang-linux ~]# echo $a          # 注:echo $a  只取出一位数组里的第一个元素
xx
[root@sanchuang-linux ~]# echo ${a[*]} # 注:${a[*]} 取出一位数组里面的全部内容,效果一样
xx yy zz ff
[root@sanchuang-linux ~]# echo ${a[@]}        # 注:${a[@]} 取出一位数组里面的全部内容
xx yy zz ff
[root@sanchuang-linux ~]# echo ${a:0:4}        # 注:对字符 xx 进行截取 从0开始
xx
[root@sanchuang-linux ~]# echo ${a:1:4}        # 注:对字符 xx 进行截取 从1开始
x
[root@sanchuang-linux ~]# echo ${a[*]:1:3} # 注:索取,效果一样(切片)
yy zz ff
[root@sanchuang-linux ~]# a=(1 2 3 4)
[root@sanchuang-linux ~]# echo ${a[*]:1:3} # 注:索取,闭区间(切片)
2 3 4

获取长度(元素个数)
#注:$# 获取参数列表长度
#echo ${#a[*]}
#echo ${#a[@]}

示例14.2:获取一位数组长度(元素个数)

[root@sanchuang-linux ~]# echo ${#a[*]}     # 注:不能用$a直接获取,因为 $a 代表 里面第一个元素
4
[root@sanchuang-linux ~]# echo ${#a[@]}
4
[root@sanchuang-linux ~]# echo ${#a}           # 注:第一个元素长度
2

示例14.3:获取字符串长度 echo ${#b}

[root@sanchuang-linux ~]# b=abc
[root@sanchuang-linux ~]# echo ${#b}
3

修改/删除 元素(shell里面一维数组的修改/删除)

示例14.4:修改/删除 元素

[root@sanchuang-linux ~]# echo ${a[*]}
xx yy zz ff
[root@sanchuang-linux ~]# a[3]="hh"             # 注:修改元素
[root@sanchuang-linux ~]# echo ${a[*]}
xx yy zz hh                                 # 注:清空数组 unset a
[root@sanchuang-linux ~]# unset a[3]               # 注:删除指定元素(下标为3)
[root@sanchuang-linux ~]# echo ${a[*]}
xx yy zz
[root@sanchuang-linux ~]# echo ${a[*]}
xx zz
[root@sanchuang-linux ~]# unset a[1]               # 注:删除不了
[root@sanchuang-linux ~]# echo ${a[*]}
xx zz
[root@sanchuang-linux ~]# echo ${!a[*]}            # 注:加! 看元素的下标
0 2             # 注:删除后,不会重新分配下标。一开始每个值的下标都一一对应了,不会改
[root@sanchuang-linux ~]# unset a[2]               # 注:删除zz元素,unset a[2],下标为2
[root@sanchuang-linux ~]# echo ${a[*]}
xx
[root@sanchuang-linux ~]#

知识点15 linux里 生成随机数

示例

[root@sanchuang-linux ~]# echo $RANDOM      # 注:自定义的环境变量
15386
[root@sanchuang-linux ~]# echo $RANDOM
24960

知识点15.2 生成指定范围内的随机数

示例1:产生10以内的随机数(不含10)

[root@sanchuang-linux ~]# echo $(($RANDOM % 10))
1
[root@sanchuang-linux ~]# echo $(($RANDOM % 10))
8
[root@sanchuang-linux ~]# echo $(($RANDOM % 10))
2
[root@sanchuang-linux ~]# echo $(($RANDOM % 10))
3

练习16

编写一个随机抽取同学唱歌的程序,如果唱过了,就不能再次被抽到了
1、编写一个文件,里面存放我们歌手的名字 name.txt
2、随机抽取歌手 # 1.循环抽取 2.抽到了就丢掉
#注:使用命令的输出 用``反引号
#注:把读到的人员名单变成一个数组

示例

[root@sanchuang-linux chenpeng]# vim geshou_test.sh
#!/bin/bash
# 将name.txt的内容读取出来                  # 注:反引号` ` 把cat命令的输出放到数组里
singers=(`cat name.txt`)                 # 注:把读取的内容放到数组里面(cat读取)
echo ${singers[@]}     # 注:验证是否取出数据 # 注:相对路径 指当前下的文件
# 有多少人
total=${#singers[@]}                      # 首先 获取人数(对singers长度进行统计)for i in `seq $total`                      # 然后循环(for 循环次数,$total 人数进行循环)
do                                      # 注:反引号` `  命令去执行它read -p "请输入任意键进行抽取"       # 注:read 目的:敲一下键盘  才会接着循环# 随机抽取一个人演唱              # 每次循环都是抽取 新的 列表里面的人数(因为下标问题)random_num=$(( $RANDOM % ${#singers[*]} ))      #注:生成随机数,范围0 ~ 一维数组长度echo "随机数为:$random_num"             # 注:随机抽取索引/下标echo "有请${singers[$random_num]}献唱一首!大家热烈欢迎!"unset singers[$random_num]              # 注:把选中的人删除(与python不同的是,删除以后下标不变)singers=(`echo ${singers[@]}`)         # 注:解决办法 重新赋值,赋值给一个新的一维数组echo "未献唱者具体名单为: ${singers[@]}"   # 注:↑也可以使用 singers=(${singers[@]})
done                                        # 注:↑也可以使用singers= `echo ${singers[@]}`
[root@sanchuang-linux chenpeng]# cat name.txt  # 注:↑重新赋值后  下标会变 从0~总长度
fengcheng
zhanghuayou
pengyifan
chenpeng
xulilin
tangliangfei
wangtiancheng
lixinhai
liangluyao

演示

[root@sanchuang-linux chenpeng]# sh geshou_test.sh
fengcheng zhanghuayou pengyifan chenpeng xulilin tangliangfei wangtiancheng lixinhai liangluyao
请输入任意键进行抽取
随机数为:2
有请pengyifan献唱一首!大家热烈欢迎!
未献唱者具体名单为: fengcheng zhanghuayou chenpeng xulilin tangliangfei wangtiancheng lixinhai liangluyao
请输入任意键进行抽取
随机数为:2
有请chenpeng献唱一首!大家热烈欢迎!
未献唱者具体名单为: fengcheng zhanghuayou xulilin tangliangfei wangtiancheng lixinhai liangluyao

#注:获取命令输出的时候 加``反引号

知识点17 产生5–10之间随机数

产生5–10之间随机数

[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 10 ))       # 注:产生10以内随机数
3
[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 5 +5 ))       # 注:取5以内的随机数 +5
6
[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 5 +5 ))
8

50–150之间随机数

[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 100 +50 ))
79                                                    # 注:100是区间绝对值,50是初始值

150-200之间随机数

#注:150初始值, 50 + 150 末尾值

[root@sanchuang-linux ~]# echo $(( $RANDOM % 50 + 150 ))   # 注:150~200之间
190

知识点18 tr命令(替换命令)

tr命令(主要用来做字符的替换) # 注:对文本处理常用
·字符转换工具
·只能对stdin操作,不能直接对文件操作 # 注:只能对标准输入进行操作

使用tr转换字符
·tr SET1 SET2
·用SET2中的字符替换掉SET1中同一位置的字符
tr -d 删除指定字符
tr -s 压缩相同字符,将连续的指定字符压缩成一个字符

示例1:替换

#注:替换同位置的
[root@sanchuang-linux chenpeng]# echo 123456| tr 345 xyz   # 注:把345替换成xyz
12xyz6  # 注:只能对标准输入进行操作
[root@sanchuang-linux chenpeng]# echo 123456| tr 3 xyz # 注:把3替换成xyz
12x456  # 注:只替换了x,对应位置的# 注:有几个位置,替换几个字符# 注:替换同位置的

示例2:删除 # echo 123456| tr -d 34

tr -d 删除指定字符

[root@sanchuang-linux chenpeng]# echo 123456| tr 3 "" # 注:"" 不能为空,它要替换同位置的
tr: 当不截断设置1 时,字符串2 不能为空
[root@sanchuang-linux chenpeng]# echo 123456| tr -d 34 # 注:删除接tr -d
1256

tr -s 压缩相同字符,将连续的指定字符压缩成一个字符
将连续的指定字符压缩成一个字符

示例3:tr -s 压缩相同字符

[root@sanchuang-linux chenpeng]# echo 111223333444445556666| tr -s 34
11122345556666  # 注:当有连续的时候压缩成一个
[root@sanchuang-linux chenpeng]# echo 11122333344444555666633377744| tr -s 34
1112234555666637774 # 注:并不是去重

练习4:把环境变量里 : 替换成空格

#注:关键点 tr不能替换文件内容

[root@sanchuang-linux chenpeng]# echo $PATH |tr ":" " " # 注:关键点 tr接收的是标准输入
/lianxi/sc /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin /usr/local/nginx/sbin /root/bin /usr/local/nginx5/sbin /root/bin

#扩展5:替换文件里的内容,生成一个新文件
#注:把文件导进来 进行标准输入

示例5:将/etc/passwd里的 :替换成空格

写法1:cat导入

[root@sanchuang-linux chenpeng]# cat /etc/passwd |tr ":" " " >/tmp/passwd
[root@sanchuang-linux chenpeng]# less /tmp/passwd  # 注::全变空格了
写法2:tr接收标准输入  重定向标准输入 tr ":" " " </etc/passwd
[root@sanchuang-linux chenpeng]# tr ":" " " </etc/passwd  >/tmp/passwd2
[root@sanchuang-linux chenpeng]# less /tmp/passwd2 # 注::全变空格了
#注:写法2把一个文件导进来,进行标准输入    tr ":" " " </etc/passwd

写法2:tr接收标准输入 重定向标准输入 tr “:” " " </etc/passwd

[root@sanchuang-linux chenpeng]# tr ":" " " </etc/passwd  >/tmp/passwd2
[root@sanchuang-linux chenpeng]# less /tmp/passwd2 # 注::全变空格了
#注:写法2把一个文件导进来,进行标准输入    tr ":" " " </etc/passwd

扩展5.1 重定向标准输入

[root@sanchuang-linux chenpeng]# wc -l /etc/passwd  # 注:wc -l 查看文件行数
52 /etc/passwd
#示例:重定向标准输入
[root@sanchuang-linux chenpeng]# wc -l < /etc/passwd
52

13_linux笔记-shell文本处理命令相关推荐

  1. RHCE课程-RH033Linux基础笔记五之常用文本处理命令、输入输出重定向、管道

    RHCE课程-初级部分5.常用文本处理命令,输入输出重定向,管道 今天主要以命令为主,虽然普通的命令没技术含量,但是有技术含量的都是以普通的命令为基础 Cat 文件名  cat是concatenate ...

  2. linux基础(四):shell简单命令;文件系统命令,系统操作命令,文本操作命令;文本处理命令

    目录 一.shell简单命令 1.1命令入门 1.1.1命令提示符详解 1.1.2命令格式 1.2 获取命令的帮助 1.2.1 help 1.2.2 命令 --help 1.2.3 查手册&搜 ...

  3. 12_linux笔记-shell脚本命令

    12_linux笔记-shell脚本命令 回顾1 输入输出重定向 输入 输出 知识点2 2个特殊文件 示例:/dev/zero:用来生成指定大小的文件,生成一堆0 示例 知识点3 here docum ...

  4. MongoDB学习笔记(3)- Mongo Shell 常用查询命令

    MongoDB学习笔记(3)- Mongo Shell 常用查询命令 本文所使用的MongoDB版本为 4.0.10 > db.version(); 4.0.10 一.find 命令进行简查询 ...

  5. linux 进入shell命令,linux或者shell进入vi命令

    vi的基本操作 a) 进入vi     在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi file 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command ...

  6. shell的嵌入命令大全

    围绕以下几点展开学习: 1.什么是shell的嵌入命令? 2.为什么使用shell? 3.怎样使用shell嵌入命令? 1.什么是shell的嵌入命令: ♦这些命令是在实际的Bourne shell里 ...

  7. linux read函数_Linux中shell输入ls命令后会系统会发生什么

    大家都用过Shell执行一些Linux命令 在命令的背后,到底发生了什么呢,让我们来一起探索 Shell执行主流程 1.Printthe info of reminding 打印提示信息 2.Wait ...

  8. linux shell find depth,搞定 Linux Shell 文本处理工具,看完这篇集锦就够了

    原标题:搞定 Linux Shell 文本处理工具,看完这篇集锦就够了 Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替.既然是基本功,那就需要掌握,毕 ...

  9. 【shell】wc命令

    wc是一个非常方便的文本处理命令,有两个功能: 统计文件的行数 统计文件的字符数 那么就有三个参数: -l :只统计行数 -w: 统计英文单词数 -m: 统计字符数 default :行数+单词数 默 ...

最新文章

  1. 计算机php什么意思,什么是PHPC(个人高性能计算机 )
  2. 2020华为推迟发布鸿蒙战略,早新闻:华为5nm麒麟芯片延期,确认新版鸿蒙将发...
  3. Django admin的一些有用定制
  4. maven依赖包下载地址
  5. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
  6. 浅谈LTE技术及实际应用方案
  7. Python---实验八
  8. Pandas高级操作
  9. 创业失败感悟第二十七天
  10. 【Unity】Geometry Shader实现
  11. 乔布斯声称Google先决定当苹果的敌人
  12. PAT L2-004 这是二叉搜索树吗 [二叉搜索树]
  13. pe服务器注册表,注册表修复方法
  14. 利用nginx搭建http和rtmp协议的流媒体服务器,用nginx搭建http/rtmp/hls协议的MP4/FLV流媒体服务器...
  15. 希望各位dalao不吝赐教
  16. 华为防火墙基础自学系列 | IKE介绍
  17. php plaintext,php从邮件正文中提取text / plain
  18. 轻量级UPF N4接口开放性技术研究与应用
  19. 解决 IllegalArgumentException: Could not resolve placeholder in string value
  20. BUC算法及其Python实现

热门文章

  1. android文字代码,编写使用Android 系统自带的文字转语音代码
  2. 如何符合功能安全ISO 26262标准
  3. 简易实现上拉刷新UpRefresh
  4. CANoe总线开发测试工具学习帖(20190329-201904)
  5. 前端diff文件对比使用worker进行优化
  6. CSS实现催眠动画效
  7. 中坚力量!中睿天下入选《2022年中国数字安全百强报告》
  8. 我心中的未来计算机100字,未来的学校作文100字
  9. 湖南科技学院计算机专业分数线,2017湖南科技学院录取分数线高考投档分
  10. 交换机(Exchange)