字符操作命令集锦,查找bash脚本中的注释代码

操作系统 1

grep
-e选项,用来指定多个模式,查找符合pattern1或pattern或pattern3的模式。
grep -e pattern1 -e pattern2 -e pattern3 -r -n filepath or dirpath

第二截取行

if [ $? -eq 0 ]
 then
 do sth
 fi

-r 递归选项 –recursive
-n 显示行号
-E 支持正则表达式
-l 显示匹配的文件名
-L, –files-without-match
-q 安静模式
-v 相反
-i 忽略大小写

-f 指定扣取的列的位置

问题:linux命令执行的返回值时数字还是字符串?
grep的返回值在自动判断的时候常常用到
 特殊之处在于使用-v的时候
grep -v “pattern” filename
也就是有没有pattern的行才是返回0,这个逻辑有点绕。

下面这行是对代码的注释
# if [ -e /etc/passwd ];then cat /etc/passwd;fi

替换 #sed ‘s/222/333/g’ filename 将所有的222取代为333

-r 递归选项 –recursive
-n 显示行号
-E 支持正则表达式
-l 显示匹配的文件名
-L, –files-without-match
-q 安静模式
-v 相反
-i 忽略大小写

问题:linux命令执行的返回值时数字还是字符串?
grep的返回值在自动判断的时候常常用到
特殊之处在于使用-v的时候
grep -v “pattern” filename
也就是有没有pattern的行才是返回0,这个逻辑有点绕。

egrep ’33(2|5)’ 1.txt 列出包含33,而且后边跟的是2或者5的行

0意味着有条件所指定的值

if [ $? -ne 0 ]
then
do sth
fi

-r
支持扩展的正则表达式(用以支持比较复杂的正则表达式)

下面这行是对代码的注释
# if [ -e /etc/passwd ];then cat /etc/passwd;fi

if [ $? -eq 0 ]
then
do sth
fi

awk -F: ‘{ if ($1==”‘$a'”) print
$1}’ /etc/passwd

出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码。也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉。假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释性代码,这可能是一个不小的工作量,让我们写一个脚本来帮助你吧,准确性无法达到百分之百,但是能够提升效率。

出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码。也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉。假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释性代码,这可能是一个不小的工作量,让我们写一个脚本来帮助你吧,准确性无法达到百分之百,但是能够提升效率。

 

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139219.htm

1.找出注释性代码的特点。
因为是bash脚本,注释行必然包含#
grep “#”
2.判断其是普通注释还是代码注释
这是重点,也是难点,如何判断一个注释行是普通注释还是对代码的注释呢?
# this is a common comment

##########################################

grep读取文件中的模式。
grep -f pattern_file

grep读取文件中的模式。
grep -f pattern_file


操作系统 ,if [ $? -ne 0 ]
 then
 do sth
 fi

3.要分析bash代码的特点,在这些特点之前加上一个#,这个就是注释代码。
所以要把注释代码的模式写入一个pattern文件,使用grep查找就可以了。
grep -E -f pattern.txt
pattern.txt内容如下:
#[ ]if
#[ ]
for
#[ ]*while

例:

1.找出注释性代码的特点。
 因为是bash脚本,注释行必然包含#
grep “#”
 2.判断其是普通注释还是代码注释
 这是重点,也是难点,如何判断一个注释行是普通注释还是对代码的注释呢?
# this is a common comment

0意味着有条件所指定的值

#grep -E [0-9]abc$ :关键字表示–以”abc”结尾且之前有一个数字

grep
-e选项,用来指定多个模式,查找符合pattern1或pattern或pattern3的模式。
grep -e pattern1 -e pattern2 -e pattern3 -r -n filepath or dirpath

 

3.要分析bash代码的特点,在这些特点之前加上一个#,这个就是注释代码。
 所以要把注释代码的模式写入一个pattern文件,使用grep查找就可以了。
grep -E -f pattern.txt
 pattern.txt内容如下:
#[\ ]if
 #[\ ]for
 #[\ ]*while

# awk ‘$1== " ‘$a ‘ " {print $0} ‘ file.txt

#awk ‘{print $9}’

当不用if判断是 条件在‘’内,{}外

-f 排序时忽略大小写

 

^ –用于匹配行首

\<the\>
–用于完整匹配单词“the”,不会匹配“them”,”there”,”other”

 

选项:-l 统计行数

#awk -F :$3==0{print $1}/etc/passwd

-n 表示显示结果所在行号

-e 以选项中指定的script来处理输入的文本文件(此处的脚本 ” s“)

#awk -F : ‘length($2)==0 {print
$1}’ /etc/shadow

 

3.#awk -F ——–用于文件内容分段提取

查看/etc 目录中属主是 root 的文件名称

第一扣取列

当没有指定分隔符时,默认以空格分隔,且多个连续空格会认为是一个空格。

read -p “please input the UID :” uid

# ll /etc | awk ‘{if ($3==”root”) print $9}’

—————————–正则表达式

awk -F: ‘{ if (length($2)==0) print
$1 }’ /etc/passwd

#patch file1(旧文件) < patch.txt 为老版本文件打补丁

grep -h select * 列出当前目录下所有包含select关键字的行

awk -F: ‘{ if ($3==500) print $1}’
/etc/passwd

#!/bin/bash

* 表示前一个字符重复任意次

$ 表示以“关键字”结尾

#sed -ire ‘ s/替换前内容/替换后内容/g’ file

 

#sed ‘1,3d’ filename 删除1-3行,显示其它行

例:扣取文件名

#sed ‘4,$d’ filename 删除从第4行到末行,显示其它行

-E 表示支持扩展的正则表达式

awk -F : -v ID=$uid ‘ $3==ID {print $1}’ /etc/passwd

如:显示系统中UID=0的用户名

——–动作

例:删除 # sed ‘5d’ filename 删除第5行,显示其他行

条件表达:

5.#wc -l -w file

#egrep 是扩展功能的grep

#tr “a-z” “A-Z” file

-i 匹配行前插入

. –用于匹配任意一个字符

—-awk 引用变量(使用选项 -v)

[0-9]\{11} :关键字表示–11位数字

转换 #sed ‘1,3y/[a-z]/[A-Z]/’ filename

选项:-c 定义扣取从开头算起的6个字符

[char] –用于匹配括号字符集中的某一个字符 []:匹配符 {} :枚举

-v 表示不包括

awk -F: ‘{ if ($3>499) print $1}’
/etc/passwd

7.#tr “原有字符” “目标字符” file

语法: sed [选项] ‘**script’** file

选项: -i 表示忽略大小写

第八、流文件编辑器—sed(不是交换模式,可用于脚本中的配置文件修改)

——-正则表达式

如显示系统中密码为空的用户名

—–需要注意:当用if判断时
条件在{}中

第七、字符替换

第三文件内容提取

script 结构 :’行描述[/正则表达式/]动作’

* –用于匹配它前面字符的任意多次

#grep 进阶

第六比较

 

第五统计

1.#cut -d: -f 1,3,4 file

第四排序

 

选项:-d 定义分隔符

——-script 是能够被sed理解的命令 ,包含:‘<行描述><动作>’

[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
表示ip地址

关键字:以 #开始**或(|)**空行——–其中 “|” 需要-E
参数的支持


^$ 表示空行

-w 统计单词数

$ –用于匹配行尾

# awk ‘$1== " ‘$a ‘ " {print $0} ‘ file.txt

——-file 是cmd进行操作的一些文件

#grep -Ev ‘^#|^$’
/etc/postfix/main.cf

-a 匹配行后附加

-c 匹配行替换

\ –用于转义某个特殊含义的字符

cut\grep\awk\sort\sed\head\tail\cat\paste\wc\uniq\diff\patch\tr

[root@localhost /]# ll | awk ‘{print $9}’

/^.*$/ 表示一整行

选项-i
修改源文件并保存
。没有改选项时,修改后内容显现都屏幕上,但是源文件并没有改变

#cut -c0-6 file

-s 替换指定内容#sed -e -i ‘s/defaults/hello/g’ /etc/file

操作系统 2

-u 删除重复行 –uniq

4.#sort -t : -k 3 -nruf file

^ 表示以“system”开头

[] 匹配可能得字符

. 表示一个任意字符

#sed -e -i ‘/^#/d’ /etc/file (删除以#开头的行)

[0-9]字符操作命令集锦,查找bash脚本中的注释代码。{1,3} : 关键字表示–1-3位数字

———tr 用于单个字符的替换

[^char] –用于匹配没有在char字符集中的字符

6.#diff file1 file2 > patch.txt 生成补丁文件

grep -l select * 列出当前目录下所有包含select关键字的文件名

awk引用变量

2.#grep -i -v^system” file

选项:-t 定义分隔符

-r 反向排序 默认是升序,即由小到大

-d 删除指定行 #sed -i -e ‘1,3d’ /etc/file (删除1–3行)

 

/^$/ 表示空行

/*/ 表示一个或多个空格

例: egrep ‘2|5’ 1.txt 列出还有2或5的行

-n 以数值的方式比较 例3 和14 比较:如果有-n 则14>3
,如果没有-n,则以字符方式比较3>1‘4’(比较首字母)

################################################

—-注意:wak中的判断 “==” 等于 ; “=”赋值

-k 指定比较的列的位置