awk记录
NF:多少列
NR:多少行
##awk中使用shell变量
$echo $sql_query
$query_result=`echo $sql_query | $sql_cmd | sed -n '2p'`
$echo $query_result | awk -F',' -v nuser=$localuser '\
{
print nuser
for (i = 0; i <= NF; i++)
{
##判断是否相等
if($i == nuser) { print $i }
}
}
多个分隔符
## one 和 | 作为分隔符
$echo 'woonea|aoaoaoaonebboneb:iooneii:' |awk -F'one|:' '{print NF}'
将两个文件按列合并
file01:
1 1
2 2
3 3
4 4
5 5
file02:
a a
b b
c c
d d
e e
第一种 使用awk
$ awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}' file01 file02
第二种 使用paste
$ paste -d " " file01 file02
拆分合并某列行
$ awk 'NR<4{a[i]=$0;i++}NR>3{print a[j] "\t" $0;j++}' file01
删除文件中的空行
$sed '/^$/d' file
$grep . data.txt
$grep -v '^$' data.txt
$grep '[^$]' data.txt
$awk NF file //这个也可以将空格、tab等组成的空行删掉
$awk '!/^$/' file
删除/替换文件末尾换行符
$cat file | tr '\n' ' '
$sed ':a;N;$!ba;s/\n/ /g' file
:a; 这是一个标签,用来实现跳转处理,名字可以随便取(a),后面的b a就是跳转指令
N; N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
s/\n/:/; s是sed的替换命令,将换行符替换为空格
b a 或者 t a b / t 是sed的跳转命令,跳转到指定的标签处
$!不包含file的最后一行
数据计算
1、let
该命令可以直接执行基本的算数计算。当使用let时,变量名之前不许要再添加$。
let result=num1+num2
#!/bin/bash
a=5
b=6
let result=a*b
echo $result
let result*=result #注意此行,变量与符号之间不能有空格
echo "the result is $result"
结果为: the result is 900
2、操作符[]
result=$[num1+num2 ]注意等号两边不能有空格
在[]中也可以用$前缀。
#!/bin/bash
a=5
b=6
result=$[a+b ]
echo "The result is $result"
result=$[$a+$a ]
echo "the result is $result"
结果为
The result is 11
the result is 10
3、使用(())也可以进行计算,但在使用(())时,变量名前需要加上$
result=$((num1 +num2 ))
#!/bin/sh
num1=5
num2=6
result=$((num1+num2))
echo "the result is $result"
4、expr同样可以用于基本的数据操作
result=`expr4+5`
result=$(expr$num1+2
以上这些方法只能用与整数的计算,而不支持浮点数的计算
备注:
bc是一个用于数学运算的高级工具。这是一个精密计算器包含了大量的选项。我们可以借助它执行浮点数运算,并应用一些高级函数
echo "4*6.4" |bc
设定小数精度。参数scale=2将小数位数个数设置为2
echo "scale=2;13/8" | bc
用bc进行进制转换。进制转换设置参数obase=进制数。
#!/bin/bash
no=100
echo "obase=2;$no" |bc
no=111111
echo "obase=10;ibase=2;$no" | bc
用bc计算平方及平方根
#echo "sqrt(100)" | bc
shell脚本加密
要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1)加密; 2)设定过期时间;
shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件,下载安装shc加密工具
#shc -v -f test.sh
# ll test*
-rwxr-xr-x 1 oracle oinstall 1178 Aug 18 10:00 test.sh
-rwx--x--x 1 oracle oinstall 8984 Aug 18 18:01 test.sh.x
-rw-r--r-- 1 oracle oinstall 14820 Aug 18 18:01 test.sh.x.c
# file test.sh.x
test.sh.x: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
可以看到生成了动态链接可执行二进制文件test.sh.x和C源文件testup.sh.x.c, 注意生成的二进制文件因为是动态链接形式, 所以在其它平台上不能运行.
可以通过下面的方法生成一个静态链接的二进制可执行文件:
$ CFLAGS=-static shc -r -f test.sh
$ file testup.sh.x
shell if参数格式
–b : 当file存在并且是块文件时返回真
-c : 当file存在并且是字符文件时返回真
-d : 当pathname存在并且是一个目录时返回真
-e : 当pathname指定的文件或目录存在时返回真
-f : 当file存在并且是正规文件时返回真
-g : 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h : 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k : 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p : 当file存在并且是命令管道时返回为真
-r : 当由pathname指定的文件或目录存在并且可读时返回为真
-s : 当file存在文件大小大于0时返回真
-u : 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w : 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的
-o : 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真
更为详细的说明
-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 ]
#字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-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 ]
位置参数 $1, $2,..., $N;
$#代表了命令行的参数数量;
$0代表了脚本的名字,第一个参数代表$1,第二个参数代表$2.
if条件判断
[ -f "/etc/shadow" ] echo "uses shadow" //如果左边的表达式为真则执行右边的语句
[ -f /var/dhcpd.pid ] rm /var/dhcpd.pid //检查文件是否存在,如果存在就删掉
#[ ] 和 [[ ]] 的区别
[[ $a == z* ]] 如果$a以z开头,那么匹配成功
[[ $a == "z*" ]] 如果$a等于z*(字符串)
[ $a == z* ] file globbing 和 world spilitting将会发生
[ "$a" == "z*" ] 如果$a等于“z*”
1564

被折叠的 条评论
为什么被折叠?



