//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';
==========================
运算符 | 描述 | 示例 |
文件比较运算符 | ||
-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 ] |
算术运算符
位操作符
> >>= 表示位左右移一位操作
关系运算符
= == != 表示大于、小于、大于等于、小于等于、等于、不等于操作
测试命令 test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试,其测试符和相应的功能分别如下。 (1)数值测试: -eq 等于则为真。 -ne 不等于则为真。 -gt 大于则为真。 -ge 大于等于则为真。 -lt 小于则为真。 -le 小于等于则为真。 (2)字串测试: = 等于则为真。 != 不相等则为真。 -z字串 字串长度伪则为真。 -n字串 字串长度不伪则为真。 (3)文件测试: -e文件名 如果文件存在则为真。 -r文件名 如果文件存在且可读则为真。 -w文件名 如果文件存在且可写则为真。 -x文件名 如果文件存在且可执行则为真。 -s文件名 如果文件存在且至少有一个字符则为真。 -d文件名 如果文件存在且为目录则为真。 -f文件名 如果文件存在且为普通文件则为真。 -c文件名 如果文件存在且为字符型特殊文件则为真。 -b文件名 如果文件存在且为块特殊文件则为真 |
当变量未定义或者值为空时,返回值为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}
(8) ${value%pattern}
${value%%pattern}
(9) ${value/pattern/string}
${value//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都会打印
示例:
------------------------------------------------------------------------------------------------------
shell字符串比较、判断是否为数字
二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别. -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) while [ ! -f $file -o "$fileSize" -lt "$FILESIZE" ] 2) while [ ! -f $file -o "$fileSize" -lt 1000 ] 3) (("$fileSize" < 1000)) 推荐使用第一种 == 等于,如:if [ "$a" == "$b" ],与=等价 != 不等于,如:if [ "$a" != "$b" ] < 小于,在ASCII字母顺序下.如: > 大于,在ASCII字母顺序下.如: -z 字符串为"null".就是长度为0 -n 字符串不为"null" 判断shell传入的参数个数是否为空:
字符串比较实例: if [ "$var1" = "$var2" ] 代码:
判断子字符串包含关系: =~ 代码:
注意: awk '{print $2}' class.txt | grep '^[0-9.]' > res |
推荐参考:
Linux Shell函数返回值
Linux 之 shell 比较运算符(推荐)
Linux Shell学习简单小结(推荐)
SHELL学习笔记----IF条件判断,判断条件