学习心得

//linux替换

#:%s/OldName/NewName/g

这些天,一直在花时间学校写CentOS 5系统管理,把很多知识先以实际的形式调通,

然后写成知识笔记,发布在这里。

#删除空白行:

#sed '/^*$/d' filename
#tr -s '\n' < aaa.csv >aaa_text.csv

#删除开始的空白行
#sed 's/^ *//'     中间有空格,表示开头到有字符之间的空格

#“aa bb cc dd”每个字符串之间可能会有多个空格,使用一条命令将这些空格删除到只保留一个
#echo "aa   bb     ccc   "| tr -s " "

重复执行某个shell命令直到成功

#!/bin/sh

if [ "$1" = "" ]
then
	echo "No args."
	exit 1
fi
while [ 1 ]
do
$1
	if [ "$?" = "0" ] && ( [ "$2" = "cr" ] || 
	   [ "$2" = "-cr" ] || [ "$2" = "--cr" ] || 
	   [ "$2" = "--checkresult" ] )
	then
		         echo "ִ.r!"	


exit 0
	fi 
done


exit 0

重定向,管道,正则表达式

wc命令 //统计指定文本文件的行数,字数,字符数
常用参数:
-c:统计输出的字节数
-l:统计输出行数
-L:统计输出最长一行的长度
-w:统计输出单词数

一 凡是涉及到文件或者文件内容是查找,搜索的处理,均用命令grep;

grep   [options]   PATTERN  [FILE]

二 凡是涉及到文件内容的修改,添加,删除,追加等的处理,均用命令sed; //注重对每一行中的字符或者字符串为对象

#显示myfile文件中所有包含LANG的行
# sed -n '/LANG/p' myfile

#向上myfile文件中所有不包含LANG的行
# sed -n '/LANG/!p' myfile

#在每个输入行中,将第一个出现的windows替换为linux,并打印替换后的行
# sed -n 's/windows/linux/p' myfile

#在每个输入行中,将出现的每个windows替换为linux
# sed 's/windows/linux/g' myfile

#在每个输入行中,将出现的每个windows替换为linux,并打印替换后的行
# sed -n 's/windows/linux/g' myfile

#在每个输入行中,将出现的每个windows替换为linux,并打印替换后的行,输入到fname文件中
# sed -n 's/windows/linux/gw fname' myfile //一定要注意是/gw

#删除行首的一个空格
# sed 's/ //' myfile

#删除每一行前导的连续"空白字符"(空格,制表符)
# sed 's/^[ \t]*//' myfile

#删除以句点结尾的行中末尾的句点
# sed 's/\.$//g' myfile

#删除每行的第一个字符
# sed 's/.//' myfile

#删除每行结尾的所有空格
# sed 's/ *$//' myfile

#在文件的每一行开始处插入两个空格
# sed 's/^/  /' myfile

#在每一行开头加上一个尖括号和空格(引用信息)
# sed 's/^/> /' myfile

#将每一行开头处的尖括号和空格删除(解除引用)
# sed 's/^> //' myfile

#删除所有空白行
# sed '/^$/d' myfile
# sed '/./!d' myfile

#删除文件顶部的所有空行
# sed '/./,$!d' myfile

#从输入的开头一直删除到第一个空行(第一个空行也删除掉)
# sed '1,/^$/!d' myfile

#删除所有偶数行,与sed -n '1~2p' myfile等效
# sed 'n;d' myfile

#删除所有包含"GUI"的行
# sed '/GUI/d' myfile

#将所有包含"GUI"的行都删除,并保持剩余部分的完整性
# sed 's/GUI//g' myfile

#在每一行后面添加一空行
# sed G myfile

#在匹配"regex"的行之后插入一空行
# sed '/regex/G' myfile

#将myfile中从case开始到esac结束的行写到文件case-block
# sed '/^case/,/^esac/w case-block' myfile

#在myfile末尾追加新行
#反斜线\是必须的,它表示将插入一个回车符,在任何要输入回车的地方都必须使用反#斜线
# sed '$a\
> newline1\
> newline2\
> newline3' myfile

#在匹配"regex"的行之后追加新行
# sed '/regex/a\
> newline1\
> newline2\
> newline3' myfile

三 awk对文本的处理,打印,字段分隔符,文本截取,奇偶行的获取,添加行号  //注重以每一行中的每个字段为对象进行处理

awk 'BEGIN    {actions}
     pattern1 {actions}
     pattern2 {actions}
...
     patternN {actions} 
     END      {actions}'  input-filename
其中,BEGIN{actions} 和 END {actions}是可选的。

#使用正则表达式匹配行,{actions}省略时表示{print}
# awk '/F[12].*/' test.txt

#使用正则表达式匹配行,并打印匹配的第一和第三列(域或字段)
# awk '/F[12].*/ { print $1,$3 }' test.txt

#更改字段分隔符为!,执行上面的操作
# awk  -F\!  '/F[12].*/ { print $1,$3 }' test.txt

#使用空格或!作为字段的分隔符(正则表达式[ !])
# awk  -F '[ !]'  '/F[12].*/ { print $1,$3 }' test.txt

#使用awk内置的取字串函数提取输入文件中的手机号
# awk  -F '[ !]'  ' { print substr($3,6) }' test.txt

#使用关系表达式书写模式,打印所奇数行
# awk 'NR % 2 == 1' test.txt

#使用关系式书写模式,打印所有奇数行的第1和第3字段
# awk 'NR % 2 == 1 { print $1,$3 }' test.txt

#打印输入文件的总行数,类似于 wc -l test.txt
# awk 'END {print NR}' test.txt
# awk '{ print NR }' test.txt //从1到最后一行

#为每一记录前面添加行号,类似于 wc -n test.txt
# awk '{ print NR,$0 }' test.txt

#为每一记录前面添加行号,并使用制表符作为行号和记录的间隔符
# awk '{ print NR "\t" $0 }' test.txt

进程管理与控制

ps命令:查看Linux系统的进程及其运行状态

a:显示所有进程
e:在命令后显示环境变量
u:显示用户名和启动时间等信息
x:显示没有控制终端的进程
f:显示进程树
w:宽行输出
-e:显示所有进程
-f:显示全部

 A, B 文件的每一行都是一个类似于asdf的字符串(有可能有重复字段),现在有没有简单的方法找出在A中出现,而在B中没有出现的内容?
我现在的做法是

cat a.txt | sort | uniq | sort > a_u.txt

cat b.txt | sort | uniq | sort > b_u.txt

comm -23  a_u.txt  b_u.txt > c.txt

//另外一种方法

cat a.txt | sort | uniq | sort > a_u.txt

cat b.txt | sort | uniq | sort > b_u.txt

diff   a_u.txt  b_u.txt | grep /<  | awk ' $1 = " " ' > c.txt

得结果就是在A的数据B中没有的部分 

Shell实现读取文本文件的内容

 写法一:
----------------------------------------------------------------------------
#!/bin/bash
while read line
do
    echo $line
done < file(待读取的文件)
----------------------------------------------------------------------------
写法二:
----------------------------------------------------------------------------
#!/bin/bash
cat file(待读取的文件) | while read line
do
    echo $line
done
----------------------------------------------------------------------------
写法三:
----------------------------------------------------------------------------
#!/bin/bash

for line in `cat file(待读取的文件)`
do
    echo $line
done
----------------------------------------------------------------------------
说明:
for逐行读和while逐行读是有区别的,如:
$ cat file
aaaa
bbbb
cccc dddd
$ cat file | while read line; do echo $line; done
aaaa
bbbb
cccc dddd

$ for line in $(<file); do echo $line; done
aaaa
bbbb
cccc
dddd

== 实践 === 

#! bin/sh
#$str='http://images.stylight.de/static/res200/s2870/2870657.1.jpg%0D'
#echo ${str##*fo}
#echo ${str#fo}
while read line
do
   wget -p ${line:0:59}
done < '/root/mysql/mysql.log';

明天继续,熟悉这些知识,然后下一步,学习好shell和perl

 ==========================

运算符 描述 示例
文件比较运算符
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string 长度非零,则为真 [ -n "$myvar" ]
string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1 -eq num2 等于 [ 3 -eq $mynum ]
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]


算术运算符 
+ - * / % 表示加减乘除和取余运算
+= -= *= /= 同 C 语言中的含义


位操作符

> >>= 表示位左右移一位操作
& &= | |= 表示按位与、位或操作
~ ! 表示非操作
^ ^= 表示异或操作 


关系运算符 

= == != 表示大于、小于、大于等于、小于等于、等于、不等于操作
&& || 逻辑与、逻辑或操作



测试命令

test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试,其测试符和相应的功能分别如下。

(1)数值测试:

  -eq 等于则为真。

  -ne 不等于则为真。

  -gt 大于则为真。

  -ge 大于等于则为真。

  -lt 小于则为真。

  -le 小于等于则为真。

(2)字串测试:

  = 等于则为真。

  != 不相等则为真。

  -z字串 字串长度伪则为真。

  -n字串 字串长度不伪则为真。

(3)文件测试:

  -e文件名 如果文件存在则为真。

  -r文件名 如果文件存在且可读则为真。

  -w文件名 如果文件存在且可写则为真。

  -x文件名 如果文件存在且可执行则为真。

  -s文件名 如果文件存在且至少有一个字符则为真。

  -d文件名 如果文件存在且为目录则为真。

  -f文件名 如果文件存在且为普通文件则为真。

  -c文件名 如果文件存在且为字符型特殊文件则为真。

  -b文件名 如果文件存在且为块特殊文件则为真


条件变量替换: 
   Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换 
条件放在{}中. 
(1) ${value:-word} 

       当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值. 


(2) ${value:=word} 

       与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将  word赋值给value 


(3) ${value:?message} 

       若变量已赋值的话,正常替换.否则将消息message送到标准错误输出(若 此替换出现在Shell程序中,那么该程序将终止运行) 


(4) ${value:+word} 

       若变量已赋值的话,其值才用word替换,否则不进行任何替换 


(5) ${value:offset} 

       ${value:offset:length}  从变量中提取子串,这里offset和length可以是算术表达式. 


(6) ${#value} 

       变量的字符个数 


(7) ${value#pattern} 

       ${value##pattern} 
       去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配 
       #与##的区别在于一个是最短匹配模式,一个是最长匹配模式. 


(8) ${value%pattern} 

       ${value%%pattern} 
       于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样 


(9) ${value/pattern/string} 

       ${value//pattern/string} 
       进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区别与上同 

注意: 上述条件变量替换中,除(2)外,其余均不影响变量本身的值 


#!/bin/bash

var1="1"
var2="2"

下面是“”运算符-a,另外注意,用一个test命令就可以了,还有if条件后面的分号

if test $var1 = "1"-a $var2 = "2" ; then
   echo "equal"
fi

下面是“”运算符 -o,有一个为真就可以

if test $var1 != "1" -o $var2 != "3" ; then
   echo "not equal"
fi

下面是“”运算符 
if条件是为真的时候执行,如果使用!运算符,那么原表达式必须为false

if ! test $var1 != "1"; then
   echo "not 1"
fi


以上三个if都为真,所以三个echo都会打印


示例:

[javascript]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #!/bin/sh  
  2.   
  3. aa="August 15, 2012"  
  4. bb="August 15, 20122"  
  5. cc="123"  
  6. dd="123"  
  7.  
  8. # -o  
  9. if [ "$aa" = "$bb" -o "$cc" = "$dd" ]; then  
  10.     echo "yes"  
  11. else  
  12.     echo "no"  
  13. fi  
  14.  
  15. # -a and !  
  16. if [ "$aa" != "$bb" -a "$cc" = "$dd" ]; then  
  17.     echo "yes"  
  18. else  
  19.     echo "no"  
  20. fi  
运行结果:
true

------------------------------------------------------------------------------------------------------

shell字符串比较、判断是否为数字

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

1 整数比较


-eq       等于,如:if [ "$a" -eq "$b" ]

-ne       不等于,如:if [ "$a" -ne "$b" ]

-gt       大于,如:if [ "$a" -gt "$b" ]

-ge       大于等于,如:if [ "$a" -ge "$b" ]

-lt       小于,如:if [ "$a" -lt "$b" ]

-le       小于等于,如:if [ "$a" -le "$b" ]

<       小于(需要双括号),如:(("$a" < "$b"))

<=       小于等于(需要双括号),如:(("$a" <= "$b"))

>       大于(需要双括号),如:(("$a" > "$b"))

>=       大于等于(需要双括号),如:(("$a" >= "$b"))


整数比较实例

  1. #!/bin/bash  
  2.   
  3.   
  4. file='folder_url_top24/url_usa_top24_0'  
  5. fileSize=`ls -l folder_url_top24/url_usa_top24_0 | awk -F '[" "]' '{print $5}'`  
  6. FILESIZE=1000  
  7. #while [ ! -f $file -o "$fileSize" -lt "$FILESIZE" ]  
  8. #while [ ! -f $file -o "$fileSize" -lt 1000 ]  
  9. while (("$fileSize" < 1000))   
  10. do  
  11.     echo "down again..."  
  12. done  
其中,下面三种整数比较都成立:

1) while [ ! -f $file -o "$fileSize" -lt "$FILESIZE" ]

2) while [ ! -f $file -o "$fileSize" -lt 1000 ]

3) (("$fileSize" < 1000))

推荐使用第一种


2 字符串比较
=       等于,如:if [ "$a" = "$b" ]

==       等于,如:if [ "$a" == "$b" ],与=等价
       注意:==的功能在[[]]和[]中的行为是不同的,如下:
       1 [[ $a == z* ]]    # 如果$a以"z"开头(模式匹配)那么将为true
       2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
       3
       4 [ $a == z* ]      # File globbing 和word splitting将会发生
       5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
       一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
       但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!=       不等于,如:if [ "$a" != "$b" ]
       这个操作符将在[[]]结构中使用模式匹配.

<       小于,在ASCII字母顺序下.如:
       if [[ "$a" < "$b" ]]
       if [ "$a" \< "$b" ]
       注意:在[]结构中"<"需要被转义.

>       大于,在ASCII字母顺序下.如:
       if [[ "$a" > "$b" ]]
       if [ "$a" \> "$b" ]
       注意:在[]结构中">"需要被转义.
       具体参考Example 26-11来查看这个操作符应用的例子.

-z       字符串为"null".就是长度为0

-n       字符串不为"null"


判断shell传入的参数个数是否为空:

[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. #!/bin/bash  
  2.   
  3. port=6379       # 命令行没参数,默认指定端口号为 6379  
  4. if [ $# -ge 1 ]; then   # 命令行参数个数大于等于1,则使用传入的参数port  
  5.     port=$1     # 获取指定端口号  
  6. fi  
  7.       
  8. echo "redis port: $port"  
  9. redis-cli -h 172.1628.10.114 -p $port  


字符串比较实例:

if [ "$var1" = "$var2" ]

代码:

  1. #!/bin/sh  
  2.   
  3. aa="August 15, 2012"  
  4. bb="August 15, 2012"  
  5.   
  6. if [ "$aa" = "$bb" ]; then  
  7.     echo "yes"  
  8. else  
  9.     echo "no"  
  10. fi  

判断子字符串包含关系: =~

代码:

[python]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. a1="ithomer"  
  2. a2="ithomer.net"  
  3. a3="blog.ithomer.net"  
  4.   
  5. if [[ "$a3" =~ "$a1" ]]; then  
  6.          echo "$a1是$a3的子串!"  
  7. else  
  8.          echo "$a1不是$a3的子串!"  
  9. fi  
  10.   
  11. if [[ "$a3" =~ "$a2" ]];then  
  12.          echo "$a2是$a3的子串!"  
  13. else  
  14.          echo "$a2不是$a3的子串!"  
  15. fi  


注意:
使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.

 awk '{print $2}' class.txt | grep '^[0-9.]' > res


推荐参考:

Linux Shell函数返回值

Linux 之 shell 比较运算符(推荐)

Linux Shell学习简单小结(推荐)

SHELL学习笔记----IF条件判断,判断条件


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值