就业班 第二阶段 2401--4.1 day10 shell之“三剑客”+Expect

十一、shell 编程-grep

egrep 支持正则表达式的拓展元字符 (或grep  -E)
#egrep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' file1.txt
[root@newrain ~]# num1=1 
1、运用正则,判断需要[[ ]] 
[root@newrain ~]# [[ $num1 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@newrain ~]# num3=1b1 
[root@newrain ~]# [[ $num3 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no
[root@newrain ~]# [[ $num =~ ^[0-9]+\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo "yes" || echo "no"       //输入的只能是数字(包括小数)
​
2、* 0或多个
[root@newrain ~]# useradd abrt 
[root@newrain ~]# grep 'abc*' /etc/passwd 
abrt:x:1041:1041::/home/abrt:/bin/bash
​
3、\< 词首定位符号 \>词尾定位符号 
[root@newrain ~]# cat jack.txt 
Jack JACK JAck jackly
:% s/\<[Jj]ack\>/123/g
​
4、^以什么开头
[root@newrain ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
​
5、$以什么结尾
[root@newrain ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
confluence:x:1000:1000:Atlassian Confluence:/home/confluence:/bin/bash 
to:x:1003:1003::/home/to:/bin/bash
​
6、. 匹配单个字符
[root@newrain ~]# grep 'r..t' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin 
[root@newrain ~]# grep 'r.t' /etc/passwd 
operator:x:11:0:operator:/root:/sbin/nologin 
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
​
7、.* 任意多个字符
[root@newrain ~]# grep 'r.*t' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin 
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin 
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
abrt:x:1041:1041::/home/abrt:/bin/
​
8、[] 匹配方括号中的任意一个字符
[root@newrain ~]# grep 'Root' /etc/passwd
[root@newrain ~]# grep '[Rr]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
​
9、[ - ] 匹配指定范围内的一个字符
[root@newrain ~]# grep [a-z]oot /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
​
10、[^] 匹配不在指定组内的字符,取反得意思
[root@newrain ~]# grep '[^0-9]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
​
[root@newrain ~]# grep '[^0-9A-Z]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
[root@newrain ~]# grep '[^0-9A-Za-z]oot' /etc/passwd
[root@newrain ~]#
[root@newrain ~]# useradd Root
[root@newrain ~]# grep '[a-z]oot' /etc/passwd      
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin Root:x:1042:1042::/home/Root:/bin/bash
[root@newrain ~]# grep '^[rc]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
^在[]内表示取反,^在[]外表示以什么开头
​
11、\(\)匹配后的标签
[root@newrain ~]# cat file1.txt 
IPADDR=192.168.1.123 
GATEWAY=192.168.1.1 
NETMASK=255.255.255.0 
DNS=114.114.114.114
:% s#\(192.168.1.\)123#\12#
:% s#\(192.\)\(168.\)\(1.\)2#\1\2\35#
:% s\(192.\)\(168.\)\(1.\)\(5\)#\1\26.\4#
​
扩展正则表达式元字符
+                       匹配一个或多个前导字符
[a-z]+ove
?                       匹配零个或一个前导字符 
lo?ve
a|b                     匹配a或b
love|hate
(..)(..)\1\2            标签匹配字符
(love)able\1er
x{m}                    字符x重复m次
o{5
x{m,}                   字符x重复至少m次
o{5,}
x{m,n}                  字符x重复m到n次
o{5,10}
​
1、+ 匹配一个或多个前导字符
[root@newrain ~]# egrep 'ro+t' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
2、? 匹配零个或一个前导字符
[root@newrain ~]# egrep 'ro?t' /etc/passwd 
abrt:x:1041:1041::/home/abrt:/bin/bash
​
3、a|b    匹配a或b
[root@newrain ~]# netstat -anlp|egrep ':80|:22'
[root@newrain ~]# egrep 'root|alice' 
/etc/passwd root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
​
4、x{m} 字符x重复m次 
[root@newrain ~]# cat a.txt
love
love.
loove
looooove 
[root@newrain ~]# egrep 'o{2}' a.txt
loove
looooove 
[root@newrain ~]# egrep 'o{2,}' a.txt
loove
looooove 
[root@newrain ~]# egrep 'o{6,7}' a.txt

十二、shell 编程-SED


非交互式编辑器,一次处理一行内容。(流文本编辑器)


sed "参数"  '模式'
参数  1 -f 指定一个规则文件 2 -n 阻止输入行输出 -r 扩展正则
模式  1 s 替换  2 g 整行(也可以是数字,替换第几个) 3 d 删除 4 p 打印 5 a 追加 6 i 是插入
示例文件
file1.txt
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA 
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK 
Terry Kalkas, 402 Lans Road, Beaver Falls PA 
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA 
Sal Carpenter, 73 6th Street, Boston MA
​
用Massachusetts替换MA:  #前面两个斜杠中是要匹配的内容,可以使用正则,后面两个斜杠中间,是要替换的内容,是纯文本
#sed 's/MA/Massachusetts/' file1.txt
使用多重指令:
# sed 's/MA/Massachusetts/ ; s/PA/Pennsylvania/' file1.txt
使用脚本文件: 
脚本:namestate 
s/MA/Massachusetts/ 
s/PA/Pennsylvania/ 
s/CA/California/ 
s/VA/Virginia/ 
s/OK/Oklahoma/
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 
$ sed -f namestate file1.txt
保存输出:
$ sed -f namestate file1.txt > newfile.txt
阻止输入行自动显示:
$ sed -n 's/MA/Massachusetts/p' file1.txt
sed流编辑器用法及解析

sed: stream editor(流编辑器)的缩写. 它们最常见的用法是进行文本的替换.

[root@newrain ~]# sed '1d' passwd //删除文件的第1行 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# sed '1,2d' passwd //删除文件的第1到2行 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# cat e.txt
/etc/abc/456
etc
[root@newrain ~]# sed -r 's#/etc/abc#/var/lib#' e.txt 
/var/lib/456
etc
[root@newrain ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
[root@newrain ~]# sed '2,$d' passwd       //删除第2行到最后一行s
root:x:0:0:root:/root:/bin/bash 
[root@newrain ~]# sed '/root/d' passwd    //匹配到root,删除此行
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
[root@newrain ~]# sed '/root/,2d' passwd  //匹配到root行,到某一行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
​
[root@newrain ~]# cat -n passwd1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin
[root@newrain ~]# sed '1~2d' passwd   //删除奇数行
bin:x:1:1:bin:/bin:/sbin/nologin 
adm:x:3:4:adm:/var/adm:/sbin/nologin 
sync:x:5:0:sync:/sbin:/bin/sync 
halt:x:7:0:halt:/sbin:/sbin/halt 
operator:x:11:0:operator:/root:/sbin/nologin
​
[root@newrain ~]# sed '0~2d' passwd    //删除偶数行
root:x:0:0:root:/root:/bin/bash  
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  1. sed可以从stdin中读取内容 $ cat filename | sed 's/pattern/replace_string/'

  2. 选项 -i 会使得sed用修改后的数据替换原文件 $ sed -i 's/pattern/replace_string/' filename

  3. g标记可以使sed执行全局替换

$ sed 's/pattern/replace_string/g' filename
$ sed 's/pattern/replace_string/gi' filename //忽略大小写替换
  1. g标记可以使sed匹配第N次以后的字符被替换 $ echo "thisthisthisthis" | sed 's/this/THIS/2g'

  2. sed中的分隔符可以替换成别的字符, 因为s标识会认为后面的字符为分隔符

$ sed 's:text:replace_text:'
$ sed 's|text|replace_text|'
  1. sed可以利用指令来删除文件中的空行 $ sed '/^$/d' filename

  2. 由于在使用 -i 参数时比较危险, 所以我们在使用i参数时在后面加上.bak就会产生一个备份的文件,以防后悔 sed -i.bak 's/pattern/replace_string/' filename

  3. sed如果在脚本中使用的话, 不可避免的要调用变量, 所以以下这种方式可以用来调用变量即' '换成了" "

$ text=hello
$ echo "hello world" | sed "s/$text/HELLO/"
  1. 在文件中匹配到的部分前后加上一行

sed '/^bin/a\hello nihao/' passwd  # 在匹配到开头为bin的行下一行插入内容
​
sed '/^bin/i\hello nihao/' passwd  # 在匹配到开头为bin的行上一行插入内容

十三、shell 编程-AWK

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 默认分隔符是空格或者tab键

awk 参数 'BEGIN{处理之前要做的} {处理内容} END{处理之后的内容}'
BEGIN{} {}
行处理前
END{}
行处理 行处理后
[root@newrain ~]# awk 'BEGIN{print 1/2} {print "ok"} END{print "----"}' /etc/hosts  # 打印的内容加上双引号
0.5
ok
ok
ok
ok 
ok
ok
----
​
awk工作原理
awk -F":" '{print $1,$3}' /etc/passwd 
(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束
(2)然后,行被:分解成字段,每个字段存储在已编号的变量中,从$1开始 
(3)awk如何知道空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符,初始时,FS赋为空格或者是tab 
(4)awk打印字段时,将以设置的方法,使用print函数打印,awk在打印的字段间加上空格,因为$1,$3间有一个,逗号。逗 号比较特殊,映射为另一个变量,成为输出字段分隔符OFS,OFS默认为空格 
(5)awk打印字段时,将从文件中获取每一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程持续到处理文件结束。
默认分隔符是空格或者tab键
awk中的特殊变量:
常用:
- NR: 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号 
- NF: 表示字段数量, 当awk将行为记录时, 该变量相当于当前列号
难理解:
FS(输入字段分隔符)   # 以什么符号去分割
OFS(输出字段分隔符)  # 以什么分隔符显示
NR(Number of record)行数  
FNR按不同的文件分开 
RS(输入记录分隔符) 
ORS(输出记录分隔符)
NF 字段个数
FS(输入字段分隔符) (filed sign)
[root@newrain ~]# awk 'BEGIN{FS=":"} {print $1}' /etc/passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
OFS(输出字段分隔符)        (output filed sign)
[root@newrain ~]# awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}' /etc/passwd 
root..x
bin..x 
daemon..x 
adm..x 
lp..x 
sync..x 
shutdown..x
​
NR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号 
[root@newrain ~]# awk -F: '{print NR,$0}' a.txt file1.txt 
1 love
2 love.
3 loove
4 looooove
5
6 isuo
7 IPADDR=192.168.6.5
8 hjahj123
9 GATEWAY=192.168.1.1
10 NETMASK=255.255.255.0
11 DNS=114.114.114.114
​
FNR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号(不同文件分开) 
[root@newrain ~]# awk -F: '{print FNR,$0}' a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
1 isuo
2 IPADDR=192.168.6.5 
3 hjahj123
4 GATEWAY=192.168.1.1
5 NETMASK=255.255.255.0
6 DNS=114.114.114.114
RS(输入记录分隔符)
[root@newrain ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# awk -F: 'BEGIN{RS="bash"} {print $0}' passwd
root:x:0:0:root:/root:/bin/
​
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
​
ORS(输出记录分隔符)
[root@newrain ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# awk -F: 'BEGIN{ORS=" "} {print $0}' passwd
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin  daemon:x:2:2:daemon:/sbin:/sbin/nologin
​
练习:将文件合并为一行
[root@newrain ~]# awk 'BEGIN{ORS="" } {print $0}' /etc/passwd
练习:把一行内容分为多行
[root@newrain ~]# cat d.txt 
root:x:0:0:root:/root:/bin/bash
[root@newrain ~]# awk 'BEGIN{RS=":"} {print $0}' d.txt 
root
x
0
0
root
/root
/bin/bash
AWK使用理解案例
  1. 打印一个文件中的第2列和第3列

    $ awk '{ print $2, $3}' filename

  2. 打印指定行指定列的某个字符

    $ awk -F":" 'NR==3{ print $7 }' /etc/passwd

  3. 统计一个文件的行数

    $ awk '{ print NR}' filename

  4. 在脚本中, 传递变量到awk中

$ var=1000
$ echo | awk -v VARIABLE=$var '{ print VARIABLE }'
  1. 指定字段分隔符-F或在BEGIN{ FS=":" }

$ awk -F: '{ print $2, $3 }' filename
$ awk 'BEGIN{ FS=":" }{ print $2, $3 }' filename
  1. 在awk中使用for循环 (了解)

每行打印两次
[root@newrain ~]# awk -F: '{for(i=1;i<=2;i++) {print $0}}' passwd 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
分别打印每行每列
[root@newrain ~]# awk -F: '{ for(i=1;i<=NF;i++) {print $i}}' passwd
  1. 在awk中使用if条件判断 (了解)

显示管理员用户名
[root@newrain ~]# awk -F: '{if($3==0) {print $1 " is administrator."}}' /etc/passwd
统计系统用户
[root@newrain ~]# awk -F":" '{if($3>0 && $3<1000){i++}} END{print i}' /etc/passwd

十四、shell 编程-Expect

No.1 expect的安装

[root@newrain ~]# yum -y install expect

No.2 expect的语法

是一个免费的编程工具, 用来实现自动的交互式任务, 而无需人为干预. 说白了 expect 就是一套用来实现自动交互功能的软件

在实际工作中我们运行命令、脚本或程序时, 这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输 入都需要人为的手工进行. 而利用 expect 则可以根据程序的提示, 模拟标准输入提供给程序, 从而实现自动化交互执 行. 这就是 expect

能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率, 如果再搭配上expect,那么很多工作都可以自动化 进行,对工作的展开如虎添翼

用法: 
1)定义脚本执行的shell#!/usr/bin/expect 类似于#!/bin/bash 
2)set timeout 30设置超时时间30s 
3)spawnspawn是进入expect环境后才能执行的内部命令,不能直接在默认的shell环境中执行 功能:传递交互命令
4)expect 这里的expect同样是expect命令功能:判断输出结果是否包含某项字符串,没有则立即返回,否则等待一段时间后返回,等待通过timeout设置 
5)send执行交互动作,将交互要执行的动作进行输入给交互指令 命令字符串结尾要加上“r”,如果出现异常等待状态可以进行核查
6)interact 执行完后保持交互状态,把控制权交给控制台 如果不加这一项,交互完成会自动退出
7)exp_continue 继续执行接下来的操作
expect环境中设置变量用set,识别不了bash方式定义的变量 
错误方式:
[root@newrain expect]# cat expect02.sh 
#!/usr/bin/expect
user=22
spawn echo $user
[root@newrain expect]# ./expect02.sh 
invalid command name "user=22"while executing
"user=22"(file "./expect02.sh" line 3)正确方式:
[root@newrain expect]# cat ./expect02.sh 
#!/usr/bin/expect
set user 22
spawn echo $user
[root@newrain expect]# ./expect02.sh
spawn echo 22 ============================================================================
​
[root@newrain expect]# cat expect01.sh 
#!/usr/bin/expect
spawn ssh root@192.168.62.146
expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "123\r" }
} 
interact
​
interact的作用测试
执行测试是否免交互:
要是用/usr/bin/expect的shell执行
[root@newrain expect]#/usr/bin/expect expect01.sh 
成功
擦除最后一行interact进行测试
[root@newrain expect]#/usr/bin/expect expect01.sh
进入之后立即退出 ============================================================================
\r的作用测试
[root@newrain expect]# cat expect01.sh 
#!/usr/bin/expect
set user root
set pass 123
set ip 192.168.62.146
spawn ssh $user@$ip
expect {"yes/no" { send "yes";exp_continue }"password:" { send "$pass" }
} 
interact
[root@newrain expect]# ./expect01.sh 
spawn ssh root@192.168.62.146 
root@192.168.62.146's password:
​
加上\r之后
[root@newrain expect]# ./expect01.sh
spawn ssh root@192.168.62.146
root@192.168.62.146's password:
Permission denied, please try again.
root@192.168.62.146's password: ============================================================================
设置变量的方式
[root@newrain expect]# cat expect01.sh #!/usr/bin/expect
set user root
set pass 123
set ip 192.168.62.146 
spawn ssh $user@$ip 
expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "$pass\r" }
}
interact
============================================================================
设置位置参数的方式(拓展)
[root@newrain expect]# cat expect01.sh 
#!/usr/bin/expect
set timeout 30
set user [ lindex $argv 0 ]
set pass [ lindex $argv 1 ]
set ip [ lindex $argv 2 ]S
spawn ssh $user@$ip
​
expect {"yes/no" { send "yes";exp_continue }"password:" { send "$pass\r" }
}
interact
运行结果为:
[root@newrain expect]# ./expect01.sh root 123 192.168.62.146 
spawn ssh root@192.168.62.146
root@192.168.62.146's password:
Last login: Thu Aug 15 23:26:59 2019 from 192.168.62.136
#!/usr/bin/expect
set username hello    # 定义变量   
set passwd 1
spawn ssh $username@172.17.138.107   # 执行交互式命令
expect {    # 捕捉系统返回,与系统进行交互"yes/no" { send "yes\r";exp_continue }"password:" {send "${passwd}\r"}
}
expect  "*]$"   # 捕捉系统返回,与系统进行交互
send "touch /tmp/abcaaa\r"
send "ls /\r"
expect eof 
interact

扩展

grep 支持基础正则

egrep grep -E 支持扩展正则

grep -P 支持perl语言的正则

fgrep grep -F 不支持任何正则或特殊符号

grep -v 反向过滤

grep -i 不区分大小写

grep -o 只取出匹配到的部分,多少次

grep -c 过滤的内容有多少行

这样出现的就是完完全全的是过滤的什么,不会自己过滤出来grep

只需要备份一份源文件

vim需要转义,因为基础正则不支持扩展正则支持,-r

awk 一行一行提交

begin 开头

FS:输入之后告诉电脑这个文件内容以什么分割,默认是空格或者tab键,如果后面是$1,$2,中的逗号对应的就是空格,如果想改变,添加OFS="以什么分割"

优先级:里面的逗号更改之后可以覆盖OFS中的分割

OFS:输出了之后以什么分割

RS:输入记录分隔符,默认:换行

ORS:输出记录分隔符,默认:换行

三个{} 分别代表表头,要执行的表中,表尾

也可以省略表头的BEGIN

练习:

查找/etc/passwd 中的指定的出现了多少次

expect(不常使用)

awk ' BEGIN{OFS="==="}{print $1,$2,$3,$4,$5,$6}' a.txt

awk '{print $1"==="$2"==="$3"==="$4"==="$5"==="$6}' a.txt的区别

前者灵活,

后者

这个命令直接在 print 语句中使用了硬编码的分隔符 === 来连接各个字段。这样,无论字段的实际内容是什么,它们都会被 === 分隔符严格分隔。这种方法的优点是简单直观,但缺点是如果某些行字段数少于六个,那么未定义的字段(如 $7、$8 等)将不会被打印,可能导致输出格式不一致或缺失数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 一种简单的软件验证码 程序授权使用 收费付费使用 无需注册 用机器码得到一个加密值 再对比加密值是否一致 只需加密

简单软件授权方案 1、获取机器码&#xff0c;发给软件开发者 2、开发者用机器码加密得到一个密文 发给使用者 3、使用者 用这个密文 与本地计算密文比较密文是否一致&#xff0c;一致就把密文写入到注册表&#xff0c;下次登录从注册表读密文对比。 &#xff08;最重要的是密…

设计模式总结-适配器模式

适配器模式 模式动机模式定义模式结构适配器模式实例与解析实例一&#xff1a;仿生机器人实例二&#xff1a;加密适配器 总结 模式动机 在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式。 通常情况下&#xff0c;客户端可以通过目标类的接口访问它所提供的…

ollama 本地轻松安装及使用docker web

这里视频其实还是蛮多的&#xff0c;环境是win10 Linux当然更好&#xff0c;奈何win10还有很多其他的AIGC的环境 所以还是索性在一个环境上比较好 1 下载 Download Ollama on macOS 修改成windows 有windows 版本所以直接下载 下载完毕后直接cmd 输入相应的下载模型 这里…

一套C#自主版权+应用案例的手麻系统源码

手术麻醉信息管理系统源码&#xff0c;自主版权应用案例的手麻系统源码 手术麻醉信息管理系统包含了患者从预约申请手术到术前、术中、术后的流程控制。手术麻醉信息管理系统主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c…

如何做好 Code Review?【下】

本文来自极狐GitLab 资源中心。原文链接&#xff1a;https://resources.gitlab.cn/articles/614fb704-882f-4601-927f-00a8b1dca2ed。 关联阅读 如何做好 Code Review&#xff1f;【上】如何做好 Code Review&#xff1f;【中】 GitLab 是一个全球知名的一体化 DevOps 平台&a…

【御控物联】JavaScript JSON结构转换(19):数组To对象——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

纯小白蓝桥杯备赛笔记--DAY9(动态规划)

文章目录 一、动态规划基础&#xff08;1&#xff09;线性DP简介步骤例题数字三角形--1536破损的楼梯-3367安全序列-3423 &#xff08;2&#xff09;二维DP简介例题摆花--389选数异或--3711数字三角形--505 &#xff08;3&#xff09;最长公共子序列LCSLCS算法模型最长公共子序…

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…

js计算器实现

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 给每个按钮添加点击事件&#xff0c;使用eval()进行计算。 3. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&q…

安全防御产品—锐安盾重磅上线,助力更安全、更流畅的业务体验

在互联网时代&#xff0c;互联网技术蓬勃发展&#xff0c;然而&#xff0c;随之而来的网络安全问题也备受关注。诸如DDoS攻击、CC攻击、常见Web攻击等攻击手段突如其来&#xff0c;导致企业业务中断&#xff0c;严重影响企业业务正常运行。对此&#xff0c;锐成云重磅推出安全防…

12 - Debian如何管理日志

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian如何管理日志 《傅老师Debian小知识库系列之12》——原创 前言 傅老师Debian小知识库特点&#xff1a; 1、最小化拆解Debian实用技能&#xff1b; 2…

Android 13 aosp 预置三方应用apk

前提条件 编译启动 launch 选择了 sdk_pc_x86_64-userdebug 该版本 添加一个三方预置应用 Android_source/vendor/third_party/MdmLib/MdmLib.apk 配置三方应用对应的Android.mk Android_source/vendor/third_party/MdmLib/Android.mk LOCAL_PATH : $(call my-dir)include $(CL…

[Apple Vision Pro]开源项目 Beautiful Things App Template

1. 技术框架概述&#xff1a; - Beautiful Things App Template是一个为visionOS设计的免费开源软件&#xff08;FOSS&#xff09;&#xff0c;用于展示3D模型画廊。 2. 定位&#xff1a; - 该模板作为Beautiful Things网站的延伸&#xff0c;旨在为Apple Vision Pro用户…

如何使用PL/SQL Developer工具导出clob字段的表?

1 准备测试数据 导出测试对象&#xff1a;表test_0102&#xff0c;others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…

git上传到本地仓库

摘要&#xff1a;本地初始化init仓库&#xff0c;进行pull和push&#xff1b;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功&#xff1a; 如果在ubantu上面没…

[C#]OpenCvSharp实现直方图均衡化全局直方图局部直方图自适应直方图

【什么是直方图均衡化】 直方图均衡化是一种简单而有效的图像处理技术&#xff0c;它旨在改善图像的视觉效果&#xff0c;使图像变得更加清晰和对比度更高。其核心原理是将原始图像的灰度直方图从可能较为集中的某个灰度区间转变为在全部灰度范围内的均匀分布。通过这种方法&a…

AI学习-线性回归推导

线性回归 1.简单线性回归2.多元线性回归3.相关概念熟悉4.损失函数推导5.MSE损失函数 1.简单线性回归 ​ 线性回归&#xff1a;有监督机器学习下一种算法思想。用于预测一个或多个连续型目标变量y与数值型自变量x之间的关系,自变量x可以是连续、离散&#xff0c;但是目标变量y必…

Visual Studio 配置代码风格审查工具cpplint

文章目录 一、Visual Studio 配置代码风格审查工具cpplint1、安装2、运行3、集成到Visual Studio4、集成到Git 前言 cpplint是一个用于检查C代码风格的工具&#xff0c;它可以帮助我们发现潜在的编码问题&#xff0c;提高代码质量。cpplint遵循Google的C编码规范&#xff0c;通…

快速获取文件夹及其子文件夹下的所有文件名

1、在文件夹中新建文本文档&#xff0c;命名为“命令.txt” 2、输入以下内容 tree /F > 文件名.txt dir *.* /B > 文件名.txt 其中文件名和文件格式可以是任意的&#xff0c;tree命令可生成文件及其子文件夹下所有文件的名称&#xff0c;dir命令只生成当前目…

用wordpress搭建视频点播发布平台

目录 一、安装操作系统、宝塔面板 二、宝塔面板部署环境 1、安装nginx