shell之awk及sed学习

来源:互联网 发布:js倒计时功能 编辑:程序博客网 时间:2024/05/16 00:41

linux 常用命令

date  日期
cal 日历信息
相对路径
绝对路径  .代表此层目录   ..代表上层目录  ~代表自己的主目录 也就是root目录
ls -a  显示所有的文件
who 查看当前登录系统所有用户名
who am l 命令 显示当前登录的用户名
ps 查看当前登录会话的所有活动进程
exit 种植linux会话
要暂时获得root 权限 su
passwd 修改当前用户的密码

vi 编辑器的使用
 G 移动光标到最后一行
dd 删除行
/word 在当前光标之后找名为word的字符串
?word 在当前光标之前找名为word的字符串
:1,$s/word1/word2/gc 在第1和最后1行之间查找字符串word1,并将word1 换成word2
,并提示用户
shell 在多用户环境中,shell将用户界面与内核分开,shell可以解释各种内核命令并充当用户与内核之间的接口

history 刚才执行过的命令
sed -i 's/\t/,/g' data.csv
直接改变文件的内容 


Linux sed命令是利用script来处理文本文件。
sed可依照script的指令,来处理、编辑文本文件。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

sed -e 4a\newLine testfile 

1、以行为单位的新增/删除
nl test.sh | sed '2,5d'           //delete

nl test.sh |sed '2a drink tea'   //add


2、以行为单位的替换与显示
nl test.sh| sed '2,5c No 2-5 number'
仅列出 test.sh 文件内的第 5-7 行   linux 中相反的用-n

 nl test.sh | sed -n '5,7p'


3、搜索 test.sh 有root关键字的行
如果root找到,除了输出所有行,还会输出匹配行。
使用-n的时候将只打印包含模板的行。
nl test.sh |sed -n '/root/p'


4、数据的搜寻并删除
删除/etc/passwd所有包含root的行,其他行输出
nl test.sh |sed '/root/d'


5、数据的搜寻并执行命令
搜索/etc/passwd,找到bash对应的行,执行后面花括号中的一组命令,每个命令之间用分号分


隔,这里把bash替换为blueshell,再输出这行:最后的q是退出。
nl test.sh |sed -n '/bash/{s/bash/blueshell/;p;q}'


6、数据的搜寻并替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 


的搜寻与替代的与 vi 相当的类似!他有点像这样:
sed 's/要被取代的字串/新的字串/g'
先观察原始信息,利用 /sbin/ifconfig 查询 IP
[root@www ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.106.226  netmask 255.255.240.0  broadcast 172.17.111.255
        ether 00:16:3e:08:0d:a2  txqueuelen 1000  (Ethernet)
        RX packets 561421  bytes 124222759 (118.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19735524  bytes 10016908122 (9.3 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
将 IP 前面的部分予以删除
[root@www ~]# ifconfig |grep 'inet 172'|sed 's/^.*inet //g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
接下来则是删除后续的部分,亦即:  netmask 255.255.240.0  broadcast 172.17.111.255


将 IP 后面的部分予以删除

[root@www ~]# ifconfig |grep 'inet 172'|sed 's/^.*inet //g'|sed 's/netmask.*$//g'


awk
基本用法
log.txt文本内容如下:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出


 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt   8s代表一个宽度8个字符(-表示左对齐


,没有则表示右对齐)
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo


用法三:
awk -v  # 设置变量
实例:
 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s


先运行$1的值后 再把值和后面的变量做运算


用法四
过滤第一列大于2的行
$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo


过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is


过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you


使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo


忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test
awk 'BEGIN{IGNORECASE=1} /this/' log.txt