字符串替换/awk/sed

1.字符串替换
sed -i 's/aaa/bbb/g'
+g :匹配每一行有行首到行尾的所有字符
不加g:匹配每一行的行首开始匹配,匹配到第一个符合的字段,就会结束,跳到下一行

2.sed与awk
sed(关键字: 编辑):以行为单位的文本编辑工具,可以分析 standard input
awk(关键字:分析&处理) 一行一行的分析处理 awk '条件类型1{动作1}条件类型2{动作2}' filename, awk 也可以读取来自前一个指令的 standard input
相对于sed常常用于一整行处理, awk则比较倾向于一行当中分成数个"字段"(区域)来处理, 默认的分隔符是空格键或tab键

如果是按行操作,就统统都用 sed
如果是不仅按行,还要按列操作,就统统都用 awk

比如文件
ab334cd-ccffafsdfbb006
bb00dg-xxxxxx80790
变成
cdab334-ccffafsdfb006b
dgbb00-xxxxx80790x 这里用sed比awk简单?

1). awk中的for循环
awk -F '' '{for(i=2;i<NF;i++) print $i}'

2). 删除以某个符号开头的行
sed -i '/^#/d' filename #删除空行
sed 's/[[:space:]]//g' #删除所有空格
sed 's/^[ ]//g' #删除行首所有空格和tab

3). vim
非编辑状态下输入:g/^$/d #删除空格行:
非编辑状态下输入:%s/^s*//g #删除行首空格:
非编辑状态下输入:%s/s*$//g #删除行尾空格:
s 是元字符,匹配空白字符,等同于[ ]
参考:https://www.cnblogs.com/penseur/archive/2011/02/25/1964522.html

习题:
sla-list中有如下内容
jdjdjj iien ['aaa','bbb','ccc']
34dgfd4jj idfaien ['aaaa','bbbb','cccc','dddd']
将[]中的aaa、bbb...提取出来
awk -F [ '{print $2}' sla-list |awk -F , '{for(i=1;i<=NF;i++) print $i}'|sed "s#'##g"|sed 's/]//g'|sed 's/^ //g'

几个注意点:
1)
NF:Number of Field
NR:Number of Row

2)awk中for循环的使用

3)sed中#的使用

使用#来代替/当分隔符,因此/不再具有转义功能,无需再加反斜杠来辨识。分隔符对单引号和双引号作用一样。

尤其在替换单引号时推荐使用# sed 's#'#hello#g'
sed 's#]#hello#g'
sed 's/]/hello/g'

3.
将oldboy目录下的文件更名(oldboy替换成oldgirl)
sed:
for i in `ls oldboy`;do newname=`echo $i|sed 's/boy/girl/g'`;mv oldboy/$i oldboy/$newname;done;

awk:
for i in `ls`;do newfile=`echo $i|awk '{gsub(/oldboy/,"oldgirl");print}'`;mv $i $newfile;done
小技巧:文件名通过echo来显示并修改

rename:
rename oldgirl oldboy *

4.rename命令
用字符串替换的方式批量改变文件名。
rename main1.c main.c main1.c #rename 原字符串 目标字符串 文件列表
支持通配符
? 可替代单个字符
* 可替代多个字符
[charset] 可替代charset集中的任意单个字符

来自: http://man.linuxde.net/rename

5.
awk '{pattern + action}' {filenames}
awk '/^[ns]/{print $1}' test -----如果记录以n或s开头,就打印这个记录

6.转换大小写
typeset -u name='hello';echo $name #变成大写
typeset -l name='HELLO';echo $name #变成小写

echo $name|tr '[a-z]' '[A-Z]'

7.切换用户时出现“su: Authentication failure”
sudo -i
chmod +s /bin/su

sudo -i: 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。
提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。
想退回普通账户时可以执行“exit”或“logout” 。

s 在文件执行时把进程的属主或组ID置为该文件的文件属主。

原文地址:https://www.cnblogs.com/stellar/p/7767465.html