1、将sqlite文件导出到csv文件:
sqlite3 -header -csv <db name>.db “select * from <tablename>;” > <outputname>.csv
2、创建任意格式和大小(字节)的文件
fsutil file createnew <filename> <filesize>
1、将sqlite文件导出到csv文件:
sqlite3 -header -csv <db name>.db “select * from <tablename>;” > <outputname>.csv
2、创建任意格式和大小(字节)的文件
fsutil file createnew <filename> <filesize>
一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。
在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。示例如下所示:
chsh <username> -s <shell>
可以定义如下两种类型的变量
可以有两种实现方法:
2>&1
&>
示例如下:
if [ 条件 ] then; command ... else if [ 条件 ] then; command... else command... fi fi
“$?”可以来检查前一命令的结束状态,通常”0”表示成功,”1-255”表示运行失败
可以使用-gt
、 -lt`` 、
-ne、
-eq`来进行比较。
break命令一个简单的用途是退出执行中的循环。我们可以在while和until循环中使用break命令跳出循环
continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是很有用的,例如错误发生,但我们依然希望
通常赋予脚本执行权限或使用bash命令调用,如下所示:
chmod +x script.sh
bash script.sh
如下格式:
#!/bin/bash # #auther: magedu #description:This is scripts 脚本主体
通常使用bash 命令中 -x
参数来执行脚本,如下格式:
bash -x script.sh
如下格式:
#!/bin/bash A="mageu" B="magedu" [[ "$A" == "$B" ]] && echo "字符串相同" || echo "字符串不同"
$0
: 命令行中的脚本名字$1..$9
: 脚本可接受的参数个数$#
: 命令行参数的数量$*
: 所有命令参数,转换为一个字符串$@
: 所有命令参数,转换为一个字符串-d
: 文件是否存在且是目录-e
: 文件是否存在-f
: 文件是否存在且是普通文件-r
: 文件存在且是否可读-s
: 文件存在且不为空-w
: 文件存在且可写-x
: 文件存在且可执行#!/bin/bash # #auther: mage team # read -p "Please Enter Your Chooice: " STR echo "${STR}
unset VAR
VAR=
有如下三种方法:
let i++
expr 1 + 2
$[ 2 + 3]
$(($num1 + $num2))
func_name() { func body ... }
方法二:
function func_name(){ func body ... }
VAR=$(echo "options;expression" | bc)
如下操作步骤
ESC + :
,进入命令模式;set list
使用trap
命令来获取,如下格式:
#!/bin/bash # auther: mage team trap 'echo "quit";exit1' INT
有如下方式:
declare -a NAME
: 申明一个索引数组declare -A NAME
: 申明一个关联数组可以使用如下方式来引用:
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
#!/bin/bash # auther : mage team # file_list=(`ls /www/log/access_log/`) NUM= $[ ${#file_list[*]} - 1 ] echo "$NUM"
有如下两种方式:
$VAR_NAME
${VAR_NAME}
from:http://www.techug.com/25-question-about-bash-shell
Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系.
上面说了Shell是一种编程语言但你可能也听说过: sh/bash/csh/zsh/…它们也叫Shell, 实际上这里所说的Shell是一种应用程序, 它负责解释执行你编写的Shell脚本, Mac默认就自带了sh/bash/csh/zsh/tcsh/ksh, 你可以这样查看cat /etc/shells
不同的shell的用法基本相同, 但有些shell提供了一些新特性, 比如我现在在用的就是zsh, 更多zsh的内容可以去看这篇文章。
#! /bin/sh echo "hello shell!"
依国际惯例这里以在终端里打印一句hello shell!开始, 第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话.
运行shell程序有3种方法:
bash hi.sh
)通常情况下, 最方便的方式就是方式1, 通过方式1执行你需要在脚本第一行写好这段脚本由哪个解释器来解释, 而通过方式2来执行则没有这个限制, 写了也没用.
除此之外方式1与方式2执行命令就没有区别了, 但方式3执行的方式与前两种都不同:
使用source执行shell脚本时, 不会创建子进程, 而是在父进程中直接执行!
这里不作更多解释, 感兴趣的同学可以去参考Linux Shell编程从入门到精通这本书的第一章的相关部分.
和其它语言一样Shell中也有变量, 而且更简单, 但有一些比较特殊的地方.
variable_name=ghui
需要注意: = 两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如:
variable_name="ghui's blog"
Shell中的变量可以分为两种类型:
local
修饰符)与其它语言一样局部变量的可见范围是代码块或函数内, 全局变量在全局范围内可见.看个简单的例子:
#! /bin/sh num=111 #全局变量 func1() { local num=222 #局部变量 echo $num } echo "before---$num" func1 echo "after---$num"
输出:
before---111 222 after---111
使用一个定义过的变量, 只要在变量名前面加$即可, 如:
name=ghui echo $name echo ${name} #{} 为了帮助解释器识别变量边界, 非必须
在使用变量时还有一个地方需要注意, 请看下面的例子:
#! /bin/sh str='abc' echo "1 print $str" echo '2 print $str'
输出:
1 print abc
2 print $str
即:
被双引号括起来的变量会发生变量替换, 单引号不会
Shell中注释使用#, 而且它不支持多行注释.
name="shell" sayHi="hello, "$name" !" sayHi2="hello, ${name} !" echo $sayHi $sayHi2
注意: 上面说的单双引号引起的变量替换问题
string="abcd" echo ${#string} #输出:4
str="hello shell" echo ${str:2} #输出: llo shell echo ${string:1:3} #输出:ell
更多关于字符串的操作可以看这个
基本语法结构:
if condition then do something elif condition then do something elif condition then do something else do something fi
其中, elif语句和else语句非必须的.看个例子:
#! /bin/sh a=1 if [ $1=$a ] then echo "you input 1" elif [ $1=2 ] then echo "you input 2" else #do nothing echo " you input $1" fi
很简单, 不过这里有两个地方需要注意, 如果某个条件下的执行体为空, 则你就不能写这个条件 即下面这样会报错:
if condition then #do nothing elif condition then # do nothing #or else #do nothing
另外, [ ]
两边一定要加空格, 下面这样都会报错:
if [$a=$b] #or if [ $a=$b] #or if [$a=$b ]
只有这样if [ $a=$b ]
才是对的.
注意: 实际上这里的[]是test命令的一种形式, [是系统的一个内置命令,存在路径是/bin/[
,它是调用test命令的标识, 右中括号是关闭条件判断的标识, 因此下面的两个测试语句是等效的:
if test "2>3" then ... fi
和
if [ "2>3" ] then ... fi
除[]之外, shell语言中还有几种其它括号, 比如: 单小括号/双小括号/双中括号/… , 不同的括号有不同的用法, 更多关于shell中, 括号的用法可以看看这个
当条件较多时, 可以选择使用switch语句, shell中的switch语句的写法和其它语言还是有些不同的, 基本结构如下:
case expression in pattern1) do something... ;; pattern2) do something... ;; pattern2) do something... ;; ... esac
看个例子:
#! /bin/sh input=$1 case $input in 1 | 0) str="一or零";; 2) str="二";; 3) str="三";; *) str=$input;; esac echo "---$str"
这个例子会根据你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case 1 | 0
代表逻辑或.
NOTE:
;;
相当于其它语言中的break
)
esac
(即反的case)基本结构:
for name [in list] do ... done
其中,[]括起来的 in list
, 为可选部分, 如果省略in list
则默认为in "$@"
, 即你执行此命令时传入的参数列表.
看个例子:
for file in *.txt do open $file done
遍历当前目录下的所有txt文件, 并依次打开.
基本结构:
while condition do do something... done
看个例子:
#! /bin/sh i=0 while ((i<5)); do ((i++)) echo "i=$i" done
输出:
i=1 i=2 i=3 i=4 i=5
NOTE: 你可能需要去了解一下(())
的用法
基本结构
until condition do do something... done
看个例子:
#! /bin/sh i=5 until ((i==0)) do ((i--)) echo "i=$i" done
输出:
i=4 i=3 i=2 i=1 i=0
shell中也支持break
跳出循环, continue
跳出本次循环.用法与C, Java中相同
要定义一个函数, 可以使用下面两种形式:
function funcname() { do something }
或者
funcname () { do something }
看个例子
#! /bin/sh # ad.sh 计算sum add() { let "sum=$1+$2" return $sum } add $1 $2 echo "sum=$?"
输入
ad 1 2
输出
sum=3
其中, $?
在shell中保存的是上一条命令的返回值
NOTE:
exit
会退出脚本, 如果想退回到原本函数调用的地方, 则可使用return
先shell脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可, 看个例子:
#! /bin/sh # test.sh echo "$# parameters"; echo "$@"; echo "$0" echo "$1"
输入:
test.sh 11 22
输出:
2 parameters 11 22 test.sh 11
之所以要写这篇博客, 有以下几个原因:
from:http://ghui.me/post/2016/06/shell-handbook/
本文将介绍Linux下使用Shell处理文本时最常用的工具:
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;
提供的例子和参数都是最常用和最为实用的;
我对shell脚本使用的原则是命令单行书写,尽量不要超过2行;
如果有更为复杂的任务需求,还是考虑python吧;
find . ( -name "*.txt" -o -name "*.pdf" ) -print
find . -regex ".*(.txt|.pdf)$"
-iregex: 忽略大小写的正则
find . ! -name "*.txt" -print
find . -maxdepth 1 -type f
find . -type d -print //只列出所有目录
-type f 文件 / l 符号链接
find . -atime 7 -type f -print
find . -type f -size +2k
按权限查找:
find . -type f -perm 644 -print //找具有可执行权限的所有文件
按用户查找:
find . -type f -user weber -print// 找用户weber所拥有的文件
find . -type f -name "*.swp" -delete
find . -type f -user root -exec chown weber {} ; //将当前目录下的所有权变更为weber
注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;
eg:将找到的文件全都copy到另一个目录:
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ;
-exec ./commands.sh {} \;
默认使用’n’作为文件的定界符;
-print0 使用”作为文件的定界符,这样就可以搜索包含空格的文件;
grep match_patten file // 默认访问匹配行
grep -c "text" filename
-n 打印匹配的行号
-i 搜索时忽略大小写
-l 只打印文件名
grep "class" . -R -n
grep -e "class" -e "vitural" file
grep "test" file* -lZ| xargs -0 rm
xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find;
-d 定义定界符 (默认为空格 多行的定界符为 n)
-n 指定输出为多行
-I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
eg:
cat file.txt | xargs -I {} ./command.sh -p {} -1
-0:指定为输入定界符
eg:统计程序行数
find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l
字段说明:
-n 按数字进行排序 VS -d 按字典序进行排序
-r 逆序排序
-k N 指定按第N列排序
eg:
sort -nrk 1 data.txt sort -bd data // 忽略像空格之类的前导空白字符
sort unsort.txt | uniq
sort unsort.txt | uniq -c
sort unsort.txt | uniq -d
可指定每行中需要比较的重复内容:-s 开始位置 -w 比较字符数
echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符 cat text| tr 't' ' ' //制表符转空格
cat file | tr -d '0-9' // 删除所有数字
-c 求补集
cat file | tr -c '0-9' //获取文件中所有数字 cat file | tr -d -c '0-9 n' //删除非数字数据
cat file | tr -s ' '
space:空白字符
lower:小写
upper:大写
cntrl:控制(非可打印)字符
print:可打印字符
使用方法:tr [:class:] [:class:]
eg: tr '[:lower:]' '[:upper:]'
cut -f2,4 filename
cut -f3 --complement filename
cat -f2 -d";" filename
cut -c1-5 file //打印第一到5个字符 cut -c-2 file //打印前2个字符
将两个文本按列拼接到一起;
cat file1 1 2 cat file2 colin book paste file1 file2 1 colin 2 book
默认的定界符是制表符,可以用-d指明定界符
paste file1 file2 -d “,”
1,colin
2,book
wc -l file // 统计行数
wc -w file // 统计单词数
wc -c file // 统计字符数
seg 's/text/replace_text/' file //替换每一行的第一处匹配的text
seg 's/text/replace_text/g' file
默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:
seg -i 's/text/repalce_text/g' file
sed '/^$/d' file
echo this is en example | seg 's/\w+/[&]/g' $>[this] [is] [en] [example]
sed 's/hello([0-9])/1/'
sed 's/$var/HLLOE/'
当使用双引号时,我们可以在sed样式和替换字符串中指定变量;
eg: p=patten r=replaced echo "line con a patten" | sed "s/$p/$r/g" $>line con a replaced
sed 's/^.{3}/
echo -e "line1nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'
echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; print var1, var2 , var3; }' $>v1 V2 v3
echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; print var1"-"var2"-"var3; }' $>v1-V2-v3
NR:表示记录数量,在执行过程中对应当前行号;
NF:表示字段数量,在执行过程总对应当前行的字段数;
$0:这个变量包含执行过程中当前行的文本内容;
$1:第一个字段的文本内容;
$2:第二个字段的文本内容;
echo -e "line1 f2 f3n line2 n line 3" | awk '{print NR":"$0"-"$1"-"$2}'
awk '{print $2, $3}' file
awk ' END {print NR}' file
echo -e "1n 2n 3n 4n" | awk 'BEGIN{num = 0 ; print "begin";} {sum += $1;} END {print "=="; print sum }'
var=1000 echo | awk '{print vara}' vara=$var # 输入来自stdin awk '{print vara}' vara=$var file # 输入来自文件
awk ‘NR awk ‘NR==1,NR==4 {print}’ file #行号等于1和4的打印出来
awk ‘/linux/’ #包含linux文本的行(可以用正则表达式来指定,超级强大)
awk ‘!/linux/’ #不包含linux文本的行
使用-F来设置定界符(默认为空格)
awk -F: ‘{print $NF}’ /etc/passwd
使用getline,将外部shell命令的输出读入到变量cmdout中;
echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'
for(i=0;ifor(i in array){print array[i];}
eg:
以逆序的形式打印行:(tac命令的实现)
seq 9| awk '{lifo[NR] = $0; lno=NR} END{ for(;lno>-1;lno--){print lifo[lno];} } '
awk 'NR<=10{print}' filename
awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ \ print buffer[i %10]} } ' filename
ls -lrt | awk '{print $6}'
ls -lrt | cut -f6
seq 100| awk 'NR==4,NR==6{print}'
awk '/start_pattern/, /end_pattern/' filename
eg:
seq 100 | awk '/13/,/15/' cat /etc/passwd| awk '/mai.*mail/,/news.*news/'
index(string,search_string):返回search_string在string中出现的位置
sub(regex,replacement_str,string):将正则匹配到的第一处内容替换为replacement_str;
match(regex,string):检查正则表达式是否能够匹配字符串;
length(string):返回字符串长度
echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'
printf 类似c语言中的printf,对输出进行格式化
eg:
seq 10 | awk '{printf "->%4sn", $1}'
while read line; do echo $line; done < file.txt 改成子shell: cat file.txt | (while read line;do echo $line;done)
for word in $line; do echo $word; done
${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片)
${#word}:返回变量word的长度
for((i=0;i<${#word};i++)) do echo ${word:i:1); done
su
cd /usr/share/apache-tomcat-8.0.9/webapps/
ls
mkdir src
rm -rf file1
cp -rp folder1 folder2
递归拷贝folder1下的文件到folder2
cp folder1/* ./folder2 -R
mv folder1 folder2
clear
exit
history
history > /var/history
tail -f access_log
pwd
diff sshd_config sshd_config.orig
ps -ef|grep java
netstat -an | grep 80
kill -9 14665
pkill java
telnet 127.0.0.1 80
ifconfig
vi server.xml
whereis ntpd
whereis systemd
which mysql
mysql -u u -p p
find | grep trans
find ./ -name mysql
grep httpd.conf
grep -ri dbdriver *
cat catalina.out
ps auxww|grep aegis
cat log.20151216.log | grep “2015/12/16 23” | less
grep -r proxy *
less mod_auth_mysql_3.0.0_patch_apache2.4.diff
cat BUILD
tar xvzf mod_auth_mysql-3.0.0.tar.gz
screen
java -jar w.jar &
patch < mod_auth_mysql_3.0.0_patch_apache2.4.diff
patch -p1 < mod_auth_mysql_3.0.0_patch_apache2.4.diff
rpm search apxs
yum search apxs
yum install httpd-devel
apxs -c -L/usr/lib/mysql -I/usr/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c
yum search mysql | grep devel
yum install apr-util-mysql
locate apr_dbd_mysql
rpm -qf /usr/lib64/apr-util-1/apr_dbd_mysql.so
man tcpdump
sudo tcpdump -ni eth1 -w dump.dat port 80
sudo tcpdump -ni eth0 -w dump.pcap port 80 or port 443
sudo tcpdump -ni eth0 -w dump.pcap port 80 and host {host}
md5sum COMODORSADomainValidationSecureServerCA.crt
sha1sum COMODORSADomainValidationSecureServerCA.crt