shell 学习笔记1501-1800

1501.巧用bash的{}扩展备份目录:
        cp file.txt{,.bak}
1502.利用at执行一次性命令:
        echo "ls -l" | at midnight      #Execute a command at a given time
1503.kill -1 或者 kill -HUP 一般用来重新读取配置文件:(一般程序自己实现的)
        HUP 其实就是给个信号,你的程序可以根据这个信号做一些事情,比如reload进程,或者是rotota日志。例如 squid、Nginx、xinetd。
        kill就是发送一个信号,而各种信号一般都有默认的意义,但是各个软件不一样。比如ping在遇到3信号的时候就会输出统计。
        nohup,就是对应的这个信号 HUP。
1504.Read-only file system:文件系统只读
        如果/data在/分区上:mount -o remount /data,其实/分区也可以remount的,只是不能umount
        原因:磁盘io很高、硬盘挂掉、死机等
        mount -o remount,rw /data           rw好像是预设值,既然有nodiratimne,加上noatime吧
1505.巧用正则的匹配位置 RSTART 和匹配长度 RLENGTH 寻找子串:
        $ echo ‘QWADGDABCfooDGJDJLGJWLJABCbarGLDABCwhyJGKABCkkJGJKDJGLABCtnndJDK‘|、
        awk ‘{while(match($0,/ABC/)){print substr($0,RSTART);$0=substr($0,RSTART+RLENGTH)}}‘
1506.多次调用 -k 实现多次排序:
        sort -t‘ ‘ -k3.3 -k1,1  #sort -k中的.表示按指定域中的第几个字符来排序
1507.重启网络用sudo /etc/init.d/networking restart,或者ifdown eth0 ifup eth0,注意要一起执行,否则你网络就断了。
1508.二进制文件编辑不要用vi,你保存后会在最后加换行,会破坏这个文件。vi会检查文件,如果没换行,会加上,二进制文件最后一般都没换行的。
        你复制个/bin/ls,用vi打开,什么都不做,保存,wc -c看下,多一个字符。
1509.EOF 不是字符,EOF是个信号,告诉程序没了。
1510.保留相邻重复行:
        echo "aaa
        1111
        1111
        1111
        aaa"|awk ‘a[$1]&&NR!=a[$1]+1{next}{a[$1]=NR}1‘
1511.man cat出现 ^H 字符:
        man cat |col -b > cat-help   :^H是高亮显示用的
        echo ‘a^Ha‘|less,a就高亮了,^H是按ctrl+v,再ctrl+h输入的
        BTW:为何退格出现 ^H :打字机时代,要加亮一个字符,操作方法是敲一次字符,回退,然后再重复敲一遍。(见维基百科)
1512.IFS设为换行符:IFS=$‘\n‘
1513.利用 find -prune 限制查找多个目录:
        find / \( -path /root/decli -o -path /data/robinechen -o -path /data/yunwei \)  -prune   -o -type f -name "*vim*"  -print
1514.巧用逻辑操作打印 rm 的报错状态:
        rm a || echo error &
        rm a & ; [ $? -ne 0 ] && echo error  # 实际上即使 rm a 出错,也不能打印出 error
1515.巧设RS合并行:
        echo "1111
        33\n
        5555" | awk -v RS=‘\\\\n\n‘ -v ORS="" 1
        awk -v RS=‘\0‘ -F‘\\\\n\n‘ ‘{for(i=1;i<=NF;i++){printf $i}}‘
1516.获取进程列表及进程路径:
        netstat -nlp|awk -F ‘[ ]+|/‘ ‘NR>2{if($0 ~/Active UNIX/){exit};res=gensub(".* +([0-9]+)/[^/]+","\\1",1,$0);a[res]}END{for(i in a){print i}}‘|xargs -I {} ls -l /proc/{}|grep -E ‘exe|cwd‘|awk ‘{print}NR%2==0{print ""}‘
1517.cut 也有输出分隔符:
        echo ‘1 3 5‘ | cut -f1-3 -d‘ ‘ --output-delimiter=o
1518.delete和backspace都无效:reset 或者 stty  cooked 试试
1519.linux下创建 dvd ISO 镜像:
        dd if=/dev/cdrom of=~/cdimage.iso
1520.利用bash转义改变grep搜索颜色:
        echo $‘\e‘[31m; grep "$1" aaa; echo $‘\e‘[37m
1521.打印第2行到倒数第2行:sed ‘1d;$d‘
1522.关于 kill -9 进程杀不掉:
        ps -eo stat,pid,cmd|grep httpd,看下进程状态
        都D了,通常是IO导致的深度睡眠,lsof看下在干嘛,
        kill -9也杀不掉?恩,D和Z都是-9杀不掉的,D只能等io结束。
1523.seq -s 设置序列分隔符:
        seq -s, 9   #echo {1..9},|sed ‘s/,$\| //g‘
        seq -s, 9 |awk ‘{for(i=1;i<=9;i++)print gensub(i,"null",1,$0)}‘
1524.通过多次的幂运算将CPU迅速撑到 100%:
        while :;do echo 2^2^20|bc &>/dev/null ;done   # 多核的话需要起多个进程丢到后台
1525.linux下如何打印出指定进程的进程树,而不是pstree打印全部的:pstree -ps pid
1526.sort 如果用-k指定了的话,那么n就要后置,如 sort -k2,3 -k1rn
1527.paste 把标准输入按列拼接成行:
        seq 20 |paste - - - - -         # xargs -n5
        注意:不同于多个输入:paste <(seq 3) <(seq 3 5)
1528.expect 在send密码之前有些系统需要 sleep 一下或者 set timeout=-1,否则导致密码在提示之前捕获而报错,可以expect -d 调试下
1529.删除 windows 下的 ^M 回车换行符:
        tr -d ‘[:cntrl:]‘  ; dos2unix;tr -d \\r;sed -i ‘/^M/d‘ # ctrl -v -M
1530.统计文件夹大小:
        du -hx --max=1 ; du -sk ;du -hsc
1531.关于shell/awk的随机数:
        随机数伪随机,是根据随机种子计算出来的,随机种子确定,随机数就确定。
        awk的随机种子默认是当天的天数。那怎么修改这个随即种子?srand()
        一般用纳秒做随机种子,不过好像awk只能获取到秒,就是同一秒执行的话随机数还是一样的。
        随机数是可能有重复的,因为是随机产生的。
1532.一个文件末尾没有换行符,怎么加个换行符:$‘\n‘
        tail -c -1判断,如果不是换行,就echo >>加一个,
        或者你这样,先echo >>,然后在去掉空行,这样就不用判断了
        很多windows编辑软件会很“贴心”得去除文件最后一个换行,vim是会很贴心的加上最后一个换行,除非是空文件,不动。
1533.关于shell解析一次,awk再解析一次转义符的例子:
        awk ‘BEGIN{print "\\("}‘        # 双引号内的\\( 被shell解析了一个
        \(
        echo "1(2)3"|awk -F ‘\\(2‘ ‘{print $2}‘   # ( 不转义是组合
        )3
        awk "BEGIN{print ‘1‘}"          # awk以单引号为分隔符,所以里面不能用单引号。除非你用""去掉单引号的作用,就像shell下一样
        awk:             ^ invalid char ‘‘‘ in expression
1534.巧用 RS、RT 匹配双引号段,去掉非双引号空格:
        echo ‘abc   234   fsdfds 555 "34   666    53242 " asaf    tttttt‘|awk -vRS=‘"[^"]+"‘ ‘{gsub(/ +/," ");printf $0 RT}‘
        abc 234 fsdfds 555 "34   666    53242 " asaf tttttt             # 注意双引号要偶数个出现,RT 会针对每一行进行动态变化。
1535.base64 的编码与解码:base64 -d <<<anVuZV8xMjAxQHFxLmNvbQo=
1536.用find 找到几千个文件,然后想用 xargs 结合 tar打包,为什么tar包里面只有部分数据:
        xargs --show-limits看下,如果你的命令超过命令行长度限制,会自动切分,用tar -r,这样就好了
1537.rsync 显示远端服务器目录列表:rsync -avz dst
1538.linux 下 .so文件找不到 一般是ld的cache目录没更新,执行了一下ldconfig,就正常了。
1539.变量不加双引号在某些特定情况下被解析为 IFS 而显示为空:
        a="";echo $a|xxd    ;a=$‘\n‘;echo $a|xxd    ;a=" ";echo $a|xxd
        空格和\n都是IFS,所以echo $a=echo, 所以要用"$a",因为不加双引号,空格被认为是IFS,跳过,因为只有零个参数,所以结果就是空
1540.用 read -N1 捕获 回车符 \n:
        read -N3 a
        echo "$a" && echo "$a"|xxd
1541.sed 中行范围扩展匹配:
        seq 10| sed -e{3,4,5,10}‘s/.*/--/‘      #行范围不固定的扩展匹配
1542.sort -g 把科学计数法按普通数字排序
1543.删除乱码:LANG=C tr ‘[:punct:]‘ 123
1544.seq 等宽并指定分隔符: seq -w -s, 0 299
        用echo 或者 for((i=1000;i<=1229;i++)); do echo ${i:-3}; done  或者 printf 格式化
1545.sort -k n.m 按某列字符排序:sort  -k 1.1,1.1  -k 1.2n  #第一列按字典排,第二列之后按数字排
1546.shell变量为了防止 word split,需要加上引号:
        [email protected]~ 00:42:25>
        a=`echo -e "1\n2"` && echo $a
        1 2
        [email protected]~ 00:58:38>
        echo "$a"
        1
        2
        [email protected]~ 00:58:42>
1547.找出bash数组是否有元素“匹配”(不是存在)给定字符串:
        a=(1 2 3 abc) && [[ "${a[@]}" =~ ‘ab‘ ]] && echo ‘------match‘          # 也可以用 grep -q
1548.合并前两列:sed -r ‘s/\s+//‘
1549.awk的asorti 是把下标按字典排序,可以得到新的下标数组与数组长度,二次引用即可获取原数组 value
        awk ‘{n=$1;getline;h[n]=h[n]"\n"$1}END{n=asorti(h,s);for(c=1;c<=n;c++)print s[c]":"h[s[c]]"\n=="}‘
        要数字排序需要把下标拿出来用 asort 函数,然后进行二次引用
1550.awk 跨行匹配,并用gsub替换返回匹配次数:
        awk ‘{$0=n$0;c+=gsub(/China/,"");n=$NF}END{print c}‘ 1.text
1551.grep -A -B实现连续多行匹配:
        seq 3|grep -A1 1|grep -B1 ^2
        awk -vk1="abc" -vk2="efg" ‘{c++}$0~k1"$"{c++;getline n;if(match(n,"^"k2))print c-1":"$0"\n"c":"n}‘ filename
1552.关于 crontab 的星期和 月日的 and or 关系:
        30 3 * * 1 dosomething , 是每周一3点半执行是确信无疑的了。
        30 3 1 * 1 dosomething , 是当1号是周一的时候执行吗?不是!是1号,或者周一的时候执行。
        crontab中的星期和日、月是一个“或”的概念,而非“和”的概念。
1553.awk、sed的缓冲问题:
        man awk :fflush([file])         #awk 不是,与系统缓存与文件大小有关。
        man sed :-u, --unbuffered       #sed 是因为他是行缓冲方式,遇到换行就会输出。
1554.sed N P D 的解释:
        首先;你加了-n参数,不会默认输出pattern space里的内容,只有p或者P操作才会打印,你先清楚这点.
        当第一行的时候,N读取下一行,注意这时候的行号已经是2了,PS里的内容是 1\n2;
        因为不是第4行,所以不执行{ } 里的操作,执行完毕,因为-n参数不会输出PS里的内容.
        这时候继续执行,已经是第三行了,因为第二行读走了,N操作,PS里的内容是3\n4,这时候行号是4,
        满足4{P;D}条件,执行P,请查阅sed资料,P是打印PS里第一行的内容,那就是3输出到了屏幕.
1555.cp mv rm,默认都是不提示,加-i才提示,这三个命令的-f参数都不一样,好好看看。
        23:57:29#tp#~> rm -f addsf
        23:57:36#tp#~> rm -f addsf
        23:57:37#tp#~> rm addsf
        rm: 无法删除"addsf": 没有那个文件或目录
        23:57:39#tp#~> rm -i addsf
        rm: 无法删除"addsf": 没有那个文件或目录
        23:57:42#tp#~>
        rm -f是不提示不存在的文件,rm 默认就是不提示是否删除,加上-i才是提示是否删除
1556.awk的精度问题:
        awk ‘BEGIN{print OFMT;print 1335533180.170077-1335533180.169424;OFMT="%f";print OFMT;print 1335533180.170077-1335533180.169424}‘
        %.6g
        0.000653028
        %f
        0.000653
1557.head 和 tail 的正负数既可表示开头也可表示取到结尾xx处:
        head -c -2      # 除去一个文件的最后两个字节,也可以 dd 或者 sed ‘$s/..$//‘
1558.查看文件以回车换行结尾:set fileformat 或者 xxd
        换行符 \n ^j 0a LF
        回车符 \r ^M 0d CR
        如果是mac,用回车做换行符,那么你直接cat是看不到换行的。
1559.awk 索引index asorti 是按字典排序,因此如果数字的话以对齐位数后再排序:
        a[sprintf("%03d",$n)]
1560.curl -G 模拟 post/get 请求(默认是 post 方式),--data-urlencode 进行 urlencode 编码
        curl -v -L -G --data-urlencode ‘我们‘ http://www.baidu.com/s
        curl -v -L -G -d "lat=41.225&lon=-73.1" http://localhost:5000/pulse     # by default, calls POST. If you want to send a GET request,use -G
1561.urlencode 编码的其它几种方式:
        echo ‘手机‘ | tr -d ‘\n‘ | xxd -plain | sed ‘s/\(..\)/%\1/g‘      # 这里用到了 xxd,python的话有API可以直接调用
1562.urldecode 编码解码:
        printf $(echo -n "http://www.baidu.com/s?wd=%ca%d6%bb%fa" | sed ‘s/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g‘)"\n"
1563.stat 查看数字权限:
        stat -c %a
1564.gzip 查看文件压缩完成时间:缺省情况下gzip会保留源文件的时间戳, 所以是查不到你想要的完成时间的
        ls -lctr yourfile.gz        或者    gzip -c foo > foo.gz
1565.cat -v 编码:
        21:44:47#tp#~> echo 中|xxd
        0000000: e4b8 ad0a                                ....
        21:49:36#tp#~> echo 中|cat -A
        M-dM-8M--$
        21:49:39#tp#~>
        d的十六进制是64,8的十六进制是38,-的十六进制是2d
        V的十六进制是56,P的十六进制是50。
        其实就是系统的一种对应关系,中文在ascii里面没有,所以就这样表示了
1566.man的相关用法:
        man 5 crontab       # 关于 crontab 的日期介绍
        man不只是有1个,有1-8。man -a crontab   就查全部 man 文档了.   man -f crontab,看有哪些帮助文档
        man -a crontab,会一个一个man看过去,你按q以后进入下一个man        # man man
1567.rsync复制原理:
        rsync 会在命令运行的初始阶段产生一个hash列表,里面列出所有要同步的文件和目录。 如果文件的大小在复制后有改变,
        那么rsync 会尝试重新复制,几次尝试后,如果还是不一致,就会报个错。
1568.test -n/[ -n ] 问题:
        在[  ]中, 如果只有一个参数, 那这个参数就被当成一个普通的字符串,并用 -n 测试其长度,
        比如, [  -gt  ],  相当于 [ -n -gt ],因此注意下面两者区别:
        [ -n "" ];echo $?           ;             [ -n ];echo $?
1569.SIGNKILL(9) 和 SIGNTERM(15) 的区别在于:
        SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。
        SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。
1570.sort排序会用到临时文件:默认 tmp 空间不足会报错:
        sort: write failed: /tmp/xxxxx: No space left on device
        linux的指定 -T 参数修改目录或者修改 TMPDIR变量
1571.printf ascii 与数字转换:
        echo "7249 81"|awk ‘{printf "%c %c\n",$1,$2}‘           # 为什么结果一样?
        echo "7249 81"|awk ‘{printf "%x %x\n",$1,$2}‘
        1c51 51                 # 高位被丢弃了
        echo "7249 81" | awk ‘{printf "%d %d\n",$1%256,$2}‘
        echo ‘7249%128‘|bc
1572.显示shell开启了哪些shell标志:
        $-     The current shell flags, such as -x and -v.
           -      Expands to the current option flags as specified upon invocation, by the set builtin command,
           or  those set by the shell itself (such as the -i option).
           set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]
           echo $- && set -x && echo $- && set +x && echo $-
1573.top获取指定id的进程信息,-b 避免输出控制字符:
        top -p 25097 -n 1 -b|cat -A
1574.巧用gsub查找单词出现的次数:awk ‘{print $1,gsub("id","")}‘
1575.脚本手动执行正常,crontab 无法执行:
        由于 crontab 不加载 profile, bashrc之类的环境变量,而这其中受的影响很大比例都是PATH变量
        所以养成好习惯:每个脚本之前就加上加载用户环境变量文件
1576.chattr 设置权限防止root删除:
        -rw-rw-rw- 1 root root 959301 May 15 15:40 .my_history
        gs_chatlog_2_207:/data # chmod 777 .my_history
        chmod: changing permissions of `.my_history‘: Operation not permitted
        gs_chatlog_2_207:/data # whoami
        root
        gs_chatlog_2_207:/data #
        lsattr .my_history
        -----a------- .my_history
        解除-a限制:chattr -a 文件名
1577.awk或perl利用时间戳获取上一天日期:
        perl -e ‘use POSIX;print strftime("%Y%m%d",localtime(time-86400))‘
        awk -vnum=-2 ‘BEGIN{print strftime("%Y%m%d",systime()+86400*num)}‘
1578.删除所有的空文件:
        find . -maxdepth 1 -size 0c -delete
        find . -maxdepth 1 -empty -delete
1579.vim可以编辑 tar.gz, tgz, zip 等压缩文件:
        vim some-archive.tar.gz
1580.临时忽略 SSH host key:
        ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]
        When you SSH to a server whose host key does not match the one stored in your local machine‘s known_hosts file,
        you‘ll get a error like " WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!" that indicates a key mismatch.
        If you know the key has legitimately changed (like the server was reinstalled),
        a permanent solution is to remove the stored key for that server in known_hosts.
1581.找出页面的最后修改时间:
        wget -S --spider http://osswin.sourceforge.net/ 2>&1 | grep Mod
        Last-Modified: Wed, 08 Feb 2012 20:14:53 GMT
        或者用 curl 替代:
        curl --head -s http://osswin.sourceforge.net | grep Mod
1582.先把整个文件的内容都显示出来然后再跟踪显示:tail -n+0 -f
1583.find -L 查找链接对应目录:
        链接  /usr/local/my_lib  ->  /usr/lib/
        find -L /usr/local/my_lib -name "*so"
1584.关于 rsync 的服务端与客户端:
        1.1.1.1:/tmp是走的ssh
        1.1.1.1::/tmp和rsync://1.1.1.1/tmp是rsync服务端
        但是很多配置是ssh不支持的,而且这样你要开帐号,还要开ssh的帐号
        否则直接虚拟帐号,比如debian啊什么的,开的rsync,难道把ssh帐号给你?
        走ssh的话其实就是scp的升级版,少点数据传输。
        rsync daemon 的话在 daemon 上控制权限,要开 daemon,ssh 的话 ssh 控制权限,要开ssh
1585.回车与换行符的终端输出:
        ^J \n 0A 换行符
        ^M \r 0D 回车符
1586.BREs, EREs是否支持\s(PREs)和sed是否支持\s没有必然联系, 没规定软件不能扩展自己的匹配方法。
1587.获取文件的绝对路径:realpath filename            # 也可以 pwd + "/" + filename
1588.tar.gz 不能直接 -r, 要先解压成 tar,再-r,最后再压缩成 tar.gz
1589.vim 列模式:
        将光标放在需要选择列的第一个字符上,在一般模式中,按下“Ctrl+v”,
        然后使用“↓”或“↑”进行块字符的选择,选中的地方会反白显示,
        可以使用使用“y”进行复制,“p”进行粘贴,“d”进行删除操作。
        或者:
        Ctrl-V 选块,然后shift-i,shift-a或者c,x进行改写操作。双击 Esc 退出确认生效。
1590.read读取标准输入的问题:
         while :    # 此时 while循环里的块 FD0 已经被 <filename.txt 覆盖,类似局部变量优于全局变量
            read    # read要读入标准输入可以 read var <&1 或者 read var </dev/tty
         done < filename.txt
1591.tcpdump -s0 不限制包长度 抓包:
        tcpdump -s0 -w a.pcap host 8.8.8.8 and tcp port 80,然后a.pcap传到本地,用wireshark打开。# wireshark 可以认为是 tcpdump的图形界面
1592.覆盖文件需要对文件有w权限,删除需要对文件所在目录有w权限,而不需要对文件有w权限:
        一个目录里面有多少文件都是记录在目录项里的。只要让这个目录不包含某个文件,就相当于删除这个文件了。
        所以删文件的实质是:使其所在的目录不再包含这个文件。所以对目录有写权限就行了。
1593.巧用 !* 匹配单词边界,实现单词字符分割:
        sed ‘s/!*/ /g‘ <<< ‘ab1c2pha‘      # 非任意字符,即为单词边界,等价于 sed ‘s/\B/ /g‘ <<< ‘ab1c2pha‘
        echo "ab1c2pha" |sed ‘s/./& /g‘         # sed ‘s/\w/& /g‘
        awk -vFS="" ‘{$1=$1}1‘ <<< ab1c2pha
1594.用printf输出一行终端字符:
        printf "%$(tput cols)s\n"|tr ‘ ‘ ‘=‘
1595.查看某个进程加载的环境变量信息:
        tr \\0 \\n </proc/$pidxxxxx/environ
        或者如果 unix、freebsd 没有 environ,那就试试下面的:
        cmdpid=`pidof cmd` && ps eww -p $cmdpid
1596.grep -l 实现打印匹配字符串的文件名,匹配并立即退出下一个,awk 的 exit 或者 nextfile 也可以实现。
1597.将多行变成一行的几种方法:
        tr、xargs -n1、awk NF+=0 ORS=" "、echo $(<file)         # paste -s  或者 column 也行
1598.每两行合并为一行:
        sed ‘$!N;s/\n/ /‘ urfile
        awk ‘{printf (NR%2)?$0 FS:$0"\n"}‘ urfile
        paste -s -d ‘ \n‘ urfile        # -d 后面的分隔符是个 list
        xargs -n2 < infile
1599.shell下的8进制转码问题:
        14:26:38#tp#~> echo $‘\270\264\274\376‘
        复件
        14:26:55#tp#~>
        这个也可以,我现在把终端编码换到gbk了,就不用iconv了
        14:21:17#tp#~> awk  ‘BEGIN{print "\270\264\274\376"}‘|iconv -f gbk -t utf-8
        复件
        14:21:24#tp#~>  # 直接 echo转不了,这里awk把\270\264转换成汉字 ,iconv是转换编码
        echo -e ‘\0270\0264\0274\0376‘也可以
        不过还是echo $‘\270\264\274\376‘方便,不然还要每个\都加个0。# echo $‘‘ 相当于 echo -e ‘‘
        按理说八进制都0开头确实比较好 不过现在好多都可以去掉0 不懂为什么这么不和谐。
        bash 3.00.15确实是这样的,后来的bash改掉了,不用加 0 了。
        其实 python -c ‘print "\270\264\274\376"‘ 也行。
1600.xargs -d 支持分隔符:
        echo "abc,dd,bach,dong,jing,shang,china,bejing" | xargs -d, -n1
1601.关于rsync相同文件后 du 大小不一样的问题:
    不一样大小很正常,因为文件系统的block不一样,或者文件系统底层用了压缩什么的。
    因为du是块大小,ls是文件的实际大小,系统的块大小一般为4KB,
    所以du的文件一般比ls的结果要大,而且系统块大小可以更改。
1602.查看系统块大小:
    tune2fs -l /dev/sda1 | grep Block
1603.vi -u NONE -N 打开超大文件:
    关掉所有vim插件,用非兼容模式打开,否则语法分析等操作很占资源的
1604.shell整数运算支持自增运算:
    ((s+=++i)) 相当于 i=$(($i+1)) && s=$(($s+$i))
1605.ssh 会截获标准输入, 例如当while里套 ssh的时候,while 读了一个值之后,ssh会读取剩下的数据,
    可以 echo ""|ssh 或者 ssh -n 也可以避免
1606.find|xargs 文件名包含了单引号: xargs: unmatched single quote
    find -regex .... -printf %h\\n
    find ...| grep ..| xargs -d ‘\n‘ -I {} dirname {}
    find ... -print0| grep ...| xargs -0I {} dirname {}
1607.用 dd 快速创建一个指定大小的空洞文件(4G压缩后只有4M):
    dd if=/dev/zero of=4G.txt bs=1G seek=4 count=0
1608.一个网段内,遍历哪些 ip 被占用可:
    nmap -v -sP 192.168.0.0/24|grep "up"|awk ‘{print $2}‘
1609.如何清理操作及登录日志记录:
    > /var/log/lastlog
    > /var/log/wtmp
    > /var/log/auth.log
    > /var/log/messages
    > ~/.bash_history
    > ~/.viminfo        # grep cmd ~/*
    kill -9 $$
1610.echo 转义输出 16 进制ascii的字符形式:echo -e "\x42"
1611.把一组 16 进制转换为ascii:
    n=54542D4632352D44362D5345
    echo $n | sed ‘s/\(..\)/\\\\x\1/g‘ | xargs echo -e
1612.利用bash扩展列出所有目录:ls ${PATH//:/ }        #第一个//表示全局替换
1613.如何踢掉指定终端 tty/pts:
    pkill -t,根据tty杀也可以或者 pts,pkill -t pts/1  #-9 强制,-15 正常结束
1614.如何禁掉外网网卡:
    ifdown eth0
    cd /etc/sysconfig/network/
    vim ifcfg-eth0
    #IP Config information for eth0:
    #IPADDR=‘113.108.1.9‘
    NETMASK=‘255.255.255.128‘
    STARTMODE=‘off‘
    GATEWAY=‘113.1.1.1‘
1615.把10000个文件切割成 100*100:
    find /root -name "*.*" -type f|split -l 100  -100a2     # -da2 用数字做后缀,限制两位,-a 默认就是两位,split -dl 100 也行
1616.man 重定向到文件出现退格符 ^H的解决办法:col -b
1617.建立临时文件的方法:直接mktemp就行了,随机+判断文件是否存在,-u、--suffix、--tmpdir、XXX 或者直接 $$
1618.产生 a-z 的字母序列:
    echo {a..z} | awk ‘NF=5‘        #利用 bash 扩展
    awk ‘BEGIN{for(i=97;i<101;i++)printf("%c ", i);printf("%c\n", i)}‘        #利用 ascii
1619.删除包含空格或tab的空行:
    grep -v -E "^[[:blank:]]*$"  或者  sed ‘/^\s*$/d‘
1620.利用 split 返回数组长度判断字符串出现的位置:替换x~y之间,出现 abc 的字符串为 _XYZ_
    echo 1abc56abc01abc5678abc|awk -vn=6 ‘{print gensub("abc","_XYZ_",split(substr($0,1,n+10),a,"abc")-1,$0)}‘    #有bug
    echo 1abc56abc01abc5678abc|awk ‘{n=6;start=substr($0,1,n-1);mid=substr($0,n,n+10);end=substr($0,n+11);gsub("abc","xyz",mid);print start""mid""end}‘
1621.screen的妙用:在SSH断开的情况下,服务器端继续执行程序,甚至从公司回到家里,你都可以还原你的linux会话状态。
    screen -S test    #创建一个名为test的screen任务
                    #输入要执行的命令,enter
                    #Ctrl + a + d保存screen
    screen -ls        #查看所有screen

    screen -r test    #恢复screen

    exit            #退出screen
1622.crontab语法详解:
    crontab [-u 用户名] [-elr]
    #crontab -e
    # 分  时  日  月  周    [用户]  command
    # 每分钟执行一次第一个参数可以写成样 1-59 或者 */1
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  *     command to be executed
1623.设置开机启动:
    vi /etc/rc.d/rc.local
1624.带有颜色的echo:
    设置颜色的格式: \e[背景色;前景色;高亮m\e[0m
    \e或\033
    背景色:0 透明(使用终端颜色), 40 黑, 41 红, 42 绿, 43 黄, 44 蓝 45 紫, 46 青绿, 47白(灰)
    前景色:30 黑 31 红, 32 绿, 33 黄, 34 蓝, 35 紫, 36 青绿, 37 白(灰)
    高亮:高亮是1,不高亮是0。(m后面紧跟字符串)
1625.while read 读取多个文件需要定义多个FD:
    while read -u3 a && read -u4 b;
    do
        echo $a=$b;
    done 3<<<"$(seq 5)" 4<<<"$(seq 4 9)"
1626.awk 重组域替换行中的多个连续空格为一个:awk ‘$1=$1‘
1627.linux关机:
    shutdown -y -i5 -g0
    sync;sync;init 5
    poweroff
1628.kill 默认信号是 -15 SIGTERM ,我们可以自定义进行捕获信号:
    while sleep 0.1
    do
        trap "echo 滚" 15    # bash a.sh & ; kill $!
    done
1629.获取命令名及时间:
    ps -eo time,cmd|awk -F: ‘/pad_/{print $2}‘
    ps ao time,cmd|awk -F: ‘/firefox/{print $1}‘        #注意用了a 就不需要 - 了
1630.16进制加法:
    A=‘0x12345678‘ && A=$(awk ‘BEGIN{printf("%x",‘$A‘+7)}‘) && echo $A
    A=12345678 && echo "obase=16;ibase=16;$A+7"|bc && echo $A
1631.让进程在后台可靠运行的几种方法: nohup/setsid/&/disown/screen
    disown是bash内部命令,nohup是外部命令
    disown跟bg,fg一样是针对job进行操作,nohup是针对命令操作
    disown -h 和nohup一样,在退出bash后,把进程的控制权都交给init
    我们可以根据不同的场景来选择不同的方案。nohup/setsid 无疑是临时需要时最方便的方法,
    disown 能帮助我们来事后补救当前已经在运行了的作业,而 screen 则是在大批量操作时不二的选择了。
1632.disown设置后台任务的方法:
    用disown -h jobspec 来使某个作业忽略HUP信号。
    用disown -ah 来使所有的作业都忽略HUP信号。
    用disown -rh 来使正在运行的作业忽略HUP信号。
    当使用过 disown 之后,会将把目标作业从作业列表中移除,
    我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
    如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?
    答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!
    CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,
    再用bg jobspec 来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。
1633.screen设置后台任务的方法:
    如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?
    此时最方便的方法就是 screen 了。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,
    使它能够在一个真实终端下运行多个全屏的伪终端。
    用screen -dmS session name 来建立一个处于断开模式下的会话(并指定其会话名)。
    用screen -list 来列出所有会话。
    用screen -r session name 来重新连接指定会话。
    用快捷键CTRL-a d 来暂时断开当前会话。
1634.zip、tar中文乱码问题:
    zip格式里面不包含编码的,7zip和rar包含的
    所以gmail给附件打包的时候,如果文件名有中文,会提示你用什么编码。
    zip包里面乱码是zip的问题,zip的文件名乱码是zmoden没转换
    tar也是这样的,里面不包含编码
    rar里面带了编码,zip没带 ,要改zip的源码,这样就可以了,不过两边都要改。
1635. 放在后台的程序,退出终端在登陆 jobs 就看不到了:
    jobs当然看不到了,jobs是针对当前shell进程的,你退出了,当然没了,不过进程还在。
    父进程变成init了,这和 $! 获取最后一个后台进程 PID 一样的道理,都是针对当前 shell。
1636.read计算回车符:
    read也可以不用\n,-n限制字符数,或者用-N,连\n也算一个字符
1637.sed显示当前行号:sed -n ‘/hello/=‘ urfile
1638.获取 5 分钟以前的时间:
    date -d "-5min" "+%s"
1639.文件名中带有感叹号:可以禁用历史扩展:set +H
    echo mv "$i" ${i%%.*}.txt
1640.利用 od -c 的命令行模式观察输入内容的 ascii:
    od -c                 #回车
    输入你的内容        #回车
    ctrl+D                #输入结束,观察一下
1641.awk --non-decimal-data 做16进制或8进制加减:
    echo "0xFFFFFFFF,0x50004000,0x34"|awk -F, --non-decimal-data ‘{printf("0x%x, 0x%x\n", $1, $2 + $3)}‘
1642.tcpdump抓包没法看见IP:tcpdump -n -nn
    10:30:56.383831 IP xaim6.48621 > 172.23.9.123.mysql
1643.使用top监视所有匹配了foo字符的进程:
    top ‘-p‘ $(pgrep -d ‘ -p ‘ foo)
    top $(pgrep foo | sed ‘s|^|-p |g‘)
1644.给定字符,随机不重复:
    tr -dc ‘abcde12345‘ </dev/urandom |head -c5
    awk -F ‘‘ ‘BEGIN{srand();for(i=1;i<=5;i++)a[i]=int(rand()*100%10+1)}{for(i=1;i<=5;i++)printf $a[i];printf RS}‘ file
    echo abcde12345 | perl -ne ‘print(((split("",$_))[sort({rand>.5} (0..9))])[0..5])‘
    echo "a b c d e 1 2 3 4 5"| awk  ‘{srand();for(i=1;i<=6;i++) {k=int(rand()*10)%(11-i)+1; a[i]=$k; $k=""; $0=$0}; for(i in a) printf(a[i]) }‘
1645.date中不用 @ 转换时间戳:
    date -d "UTC 1970-01-01 1234567890 secs"    #此方法在大于2038年的时候会有问题,即使是 64bit 也是有问题的。32473710849
1646.curl 获取外网ip:
    curl ifconfig.me/all
    curl http://iframe.ip138.com/city.asp 2>/dev/null|sed -n ‘s#.*<center>\|</center>.*##gp‘
    主:如果用正则的反向引用需要注意终端编码。
1647.巧用通配符重命名单个数字文件:
    for i in ?.ogg; do mv $i 0$i; done
1648.seq和printf输出指定宽度的数字:
    seq -f ‘%02.g‘ 5
    printf ‘%02d\n‘ {1..5}
1649.设置linux终端窗口的标题文字:
    PROMPT_COMMAND="echo -ne ‘\033]0;$title\007‘"
1650.inode用完导致的磁盘空间不够:
    dumpe2fs -h /dev/hda6 | grep node            #查看inode总数及inode大小,inode是在分区的时候建立的
    tune2fs -l /dev/DEVICE | grep -i inode        #查看inode总数及inode大小,要调整总数需要重新格式化
    df -i        #查看各分区的inode使用情况
1651.awk判断ip公有还是私有:
    echo $IP | awk -F‘.‘ ‘{
        if($1==10 || ($1==172&&$2>=16&&$2<=31) || ($1==192&&$2==168)) p=1;
        else p=0;
        print $0 "\t" p;
    }‘

    echo $1|awk -F"[^0-9]" ‘NF==4&&$1<256&&$2<256&&$3<256&&$4<256{
        if($1==10||$1==192&&$2==168||$1==172&&$2>15&&$2<32)print
    }‘
1652.awk mktime("1970 01 01 0 0 0") 由于时区问题导致不为 0 的问题:
    $ export TZ=UTC
    $ awk ‘BEGIN{print mktime("1970 01 01 00 00 00")}‘    # 0
    $ export TZ=UTC8
    $ awk ‘BEGIN{print mktime("1970 01 01 00 00 00")}‘    # 28800
    $ export TZ=UTC-8
    $ awk ‘BEGIN{print mktime("1970 01 01 00 00 00")}‘    # -28800
1653.安装libgcc_s.so.1出现错误Error: Protected multilib versions:
    可以模糊安装试试:yum install libgcc*
1654.为什么访问不同的网站,公网ip是不一样的:
    访问不同的地址,isp会选择不同的线路,他们每条线路出口都是nat转换的,所以看起来ip会是在任意地方的。
    小运营商都这么搞,叫“穿透接入”
1655.sed从第n个字符开始全局替换:ng
    echo aaaaa|sed ‘s/a/b/2g‘
1656.touch 不改变文件时间:
    touch -r oldfile newfile
1657.tar自动识别后缀:
    高版本的话,直接 tar axf,自动识别类型,不用管扩展名了
1658.当同时有标准输出和文件名的时候,很多命令都是以文件名为优先的: 例如cat或者sort:
    seq 3|cat a
1659.巧用sort+uniq进行按列去重:
    echo "c 150"|sort|uniq -u -w 1        #按第一列去重
1660.export 格式化列出所有环境变量:export -p
1661.获取 ls -lrt 的最后一列:
    ls -1 会将 ls -l 的长格式的最后一列打印出来,等价于 ls|xargs -0
1662.用 nc 与给定的主机端口进行一次 tcp 握手:
    nc -zvw 1 host port
1663.以另一用户身份运行一个命令:
    runuser -l  userNameHere -c ‘command‘    # runuser -l nginx -c ‘ulimit -SHa‘
    su - root -c "command"        # su - oracle -c ‘ulimit -aHS‘
1664.从匹配的下一行开始打印,直至结束:
    awk ‘/xyz/{tag=1;next}tag‘ file        # 第一次匹配至文件尾
    awk -vRS="[a-z]*xyz[a-z]*"  ‘END{print $0}‘ data        # 巧用 RS + END 打印最后一段匹配的
1665.xargs 处理带空格或特殊字符的文件:print0 | xargs -0
    -i {}对空白字符做了特殊处理,但是其它特殊字符还是不行的,试试touch "a‘b"
1666.shell ! 扩展通配符排除某个文件:
    shopt -s extglob然后cp 1/!(glo.txt) 2/这样也行
1667.在历史记录里查询某个命令打印它,而不是执行它:
    !<command>:p
1668.输出特定长度的随机数字:
    awk ‘BEGIN{srand();a=rand()*100000000;printf("%08d\n",a)}‘
1669.语言字符环境设置:
    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8
    export LC_CTYPE=en_US.UTF-8
1670.sed -e{} 固定行范围扩展:
    sed -e{,}{1,4}‘s/\S\+ *//3‘     #删除第1、4行的第3个域,注意前面的{,}
1671.中文与十六进制互换:
    echo -n "中"|xxd -ps
    反过来从0xd6d0得到汉字:echo -e "\xd6\xd0"         #0xd6d0 该结果与终端编码有关,类似 urlencode、urldecode
1672.awk --source进行外部函数调用:
    seq 10|awk -f func_awk -W source ‘{print;echo_hello()}‘        #假设func_awk 是一个文件,里面定义了一个名为 echo_hello 的函数。
1673.tar 利用标准输出配合 gzip 创建压缩文件:
    tar cvf - "$folder" |gzip > /new_folder/$folder.tar.gz        # - 相当于文件占位符
1674.中文转16进制:
    echo -n 我 | iconv -t utf-16le | hexdump -e ‘"%d"‘
1675.打印当前目录以及所有父目录的权限:
    namei -m $(pwd)
1676.单词边界与空串的区别:
    echo "abcdef"|sed ‘s/[^a-z]*/ /g‘        #空串,注意此处 * 代表 0 次
    echo "abcde 1?2 *f"|sed ‘s/\B/ /g‘        #单词边界
1677.理解正则中的“单词边界与非单词边界”:
    aba 的单词边界为:\ba\Bb\Ba\b
    \b 为单词边界        echo "fabcfde 1?2 *f"|grep --color ‘\bf‘
    \B 为非单词边界        echo "fabcfde 1?2 *f"|grep --color ‘\Bf‘
1678.shell扩展通配 extglob 排除文件:
    shopt -s extglob; cp aaa/!(1*) bbb; shopt -u extglob
1679.tar中不能压缩 -z 和追加 -r 混用,-r 只能用在打包中:
    line 22: 18962 Aborted (core dumped) tar -zrvf $ip.tgz ${ip}_${ssn}.sql
    gunzip a.tgz -c|tar rf - b|gzip >b.tgz        #试过了,也不行,因为-r和-f -不兼容
1680.双机信任中,拷贝公钥到远端机器:
    ssh-copy-id -i .ssh/id_rsa.pub user<a href="http://my.oschina.net/server" target="_blank" rel="nofollow">@server</a>
1681.sort -h 按人类易读的字节大小排序:
    find . -type f -print0 | xargs -0 du -h | sort -hr | head -10        #递归找出10个当前目录下最大的文件
1682.你可以  ls -l /proc/pid/fdinfo/  ,观察那个文件读到哪了 # cat /proc/XXXX/fdinfo/Y
1683.xargs 的行列合并:直接xargs为合并,xargs -n1 为拆分:
    echo a b d e b f a c e d | xargs -n1 | sort -u | xargs
1684.ping快速检测主机存活:
    ping -c1 -W 1 8.8.8.8        # -c次数 -W超时时间
1685.windows管理命令:msinfo32; systeminfo; control; gpedit.msc; msconfig; services.msc
1686.awk4.0 在asorti中对下标索引按数字排序: asorti(a,b,"@ind_num_asc")
1687.rsync只有源和目的,没本地和远程,你可以本地到本地,也可以远程到远程。
    加了 -delete 之后,不是增量同步了(默认),而是镜像同步,会将 dest 上的多余文件删掉。
1688.cut -d 不支持多字符分隔符(如 \t)的问题:
    echo -e "1\t2"|cut  -d\t -s -f2        #注意此处的 \t 相当于t,-s的作用相当于sed -n,防止不匹配的时候全文输出
    cut默认就是制表符 \t,就像 echo 不支持 \t 要 -e 才行
    或者 \t用 CTRL+V+TAB ;CTRL+V +I 代替
1689.获取管道里各个命令的执行状态:PIPESTATUS 数组
1690.Gnu Sed 定址匹配的几点说明:
    1. GNU 恰巧有许多对 POSIX sed 标准便利、省时的扩展。另外,GNU 没有 sed 早期专门版本的很多限制,如行长度限制 -- GNU 可以轻松处理任意长度的行.
    2. first~step   GNU扩展,选定 起始行~步长 的那些行。例如选择所有奇数行1~2;选择从第2行开始的,每隔3行 ‘2~3‘
    3. /regexp/I 和 \%regexp%I  : GNU扩展,忽略大小写.
    4. 0,/regexp/ : 这是唯一一个使用0作为行号不会报错的用法,一般情况下不存在”第0行”,在任何其他命令中使用0作地址都会报错.
    5. addr1,+N  匹配addr1和它后边的N行
    6. addr1,~N  匹配addr1和它后边的行,直到输入的下一行的行号是N的倍数
    例如:seq 10|sed -n ‘2,~3p‘        #从2开始到第一个能被3整除的行为止
1691.<(cmds) 是bash进程替代(Process Substitution), 如果理解什么是命名管道,
    那么<(...)就是一个临时的命名管道,如果不理解,
    可以简单的看作bash产生一个/dev/fdxxx的文件, 文件内容是cmds的标准输出
1692.关于 sh 软链接 bash 的问题:虽然 sh 链接了 bash,但单独执行他们仍可能不一样的结果:
    bash可以根据自己被 exec() 时的参数调整自己的行为, 你叫它sh它就按sh的规则玩, 你叫它bash它就按bash的规则玩,
    *nix系统里这样的例子太多了, 多个工具指向同一个文件, 按名字产生不同的结果
1693.找出所有可写的文件:find / -writable 2>/dev/null
1694.结束指定端口的进程:
    fuser -kn tcp 7072
    lsof -i:7072 |awk ‘{print $2}‘ |sort -u |xargs kill
1695.csplit:根据匹配的指定内容,按行分割文件,split可以按行数或者文件大小分割文件:
    csplit a /d/ {*}
    awk ‘/d66/{i++} {print > "file" i}‘ infile
1696.nc代替telnet扫描端口:
    nc -z -w 10 -u 192.168.1.106 137    # 成功会显示信息,不成功没有,可以返回值判断
    -z表示检测或者扫描端口  -w表示超时时间   -u表示使用UDP协议
1697.find -empty可以找出空目录,-size 0不行,-exec后面肯定要用\;或者+来执行方式的
    find -print0|xargs -0,这两个参数就是互相配合的
    如果你不理解+和;的区别,最好还是用xargs,而且xargs还能限制命令行长度,参数个数,比exec的+和;强大多了
    ; 一个是每个参数执行一次,cmd arg1;cmd arg2;ls|xargs -I{} echo {} 或者 xargs -n1
    + 是所有参数执行一次,cmd arg1 agr2;ls|xargs echo
1698.(())算术扩展的类eval应用:
    a=1;b="";c=3
    for i in a b c; do (( $i==0?$i=0:$i )) ; done
    for i in a b c; do test -z ${!i} && eval $i=0; done
1699.tcpdump匹配http头:
    tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
    0x4745 为"GET"前两个字母"GE"
    0x4854 为"HTTP"前两个字母"HT"
1700.php-fpm 重载配置方法(解决新版不带reload/stop)
    php从5.3就可以集成php-fpm,但是集成后的php-fpm去掉了sbin/php-fpm (start|stop|reload)这些命令,只能启动。
    可以使用信号量,下pid为进程"php-fpm: master process"的pid
    重载进程和配置文件:kill -USR2 pid
              退出进程:kill -QUIT pid
              立即停止:kill -INT pid
1701.大量连接处于 TIME_WAIT 状态的解决方法:
    netstat -nt 看到大量 TIME_WAIT
    dmesg 看到 time wait bucket table overflow
    解决办法:1、 /proc/sys/net/ipv4/tcp_max_tw_buckets 过小了,设成540000以上
              2、 /sys/module/ip_conntrack/parameters/hashsize 过小了,
                  设成/proc/sys/net/ipv4/netfilter/ip_conntrack_count这个值的1/4大小较为合适
1702.编译php出错:error while loading shared libraries: libmysqlclient.so.18: cannot open shared object:
    ln -s /usr/local/mysql/lib/libmysqlclient.so.18  /usr/lib/
    照做后仍然报错,原因是该方法适用于32位系统,64位系统应使用下面的这行
    ln -s /usr/local/mysql/lib/libmysqlclient.so.18  /usr/lib64/
    另外:在编译的时候,不写mysql的路径,而使用mysqld代替,也可解决该问题的出现。
1703.shell打印当前行号:
    echo "$LINENO"
    显示函数在哪一行被调用的:
    line(){
        echo call by line `caller 0 | awk ‘{print$1}‘`
    }
    line
1704.当系统swap空间所剩不多时,可通过在本地磁盘上创建普通文件作为swap :
    dd一个文件,然后mkswap,然后swapon
    dd if=/dev/zero  of=./swapfile bs=1M count=1000
    mkswap ./swapfile
    swapon ./swapfile
    即可为系统临时增加1G的swap。
    使用完毕后执行:
    swapoff ./swapfile
    rm -f swapfile
1705.多行结果赋值给变量:用引号防止 shell 做 word split:
    file=`find . -name "*"`
    echo "$file"
1706.wireshark 八进制编码问题:
    google.com/search?q=淘宝网     这个http请求,抓包里面对应的内容是
    GET /search?q=\314\324\261\246\315\370 HTTP/1.1\r\n
    \314\324\261\246\315\370这一段对应的是淘宝网3个字,应该是gbk,gbk是每个汉子两个
    \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
    8进制,转换成十六进制看看,再看编码
    CC D4对应\314\324     echo 0:ccd4|xxd -r|iconv -f gbk -t utf-8
    echo $‘\314\324\261\246\315\370‘|iconv -f gbk -t utf-8
    前面要加$,这样是表示8进制的
1707.sort -n -g 按数字排序的区别:
    -g 通用数值排序,-n 数值排序。
    -g 支持的记数方法比 -n 广,-g 使用标准 C 函数 strtod 来转换数值,支持科学记数法,如 1.0e-34,
    不过 -g 比 -n 慢得多。详细区别参考info sort文档或者stackoverflow.com。
1708.关于sort -h排序问题:
    echo "2025K
    1M
    1G"|sort -h        # du、ls、df 等能保证输出一定是k<m<g的格式,不会存在2025k这种形式的。
1709.使用 cURL 测试 Web 站点的响应时间:
    curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://www.canada.com
1710.设置用户的进程数限制:
    /etc/security/limits.conf
    /etc/profile里面写ulimit -n 65535,只有root才能增加,这样其它用户登录都会报错。
    nofile 是打开文件数,nproc是进程数,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。
    soft 的限制不能比hard 限制高。用 - 就表明同时设置了 soft 和 hard 的值
1711.ssh不输出连接信息:
    ssh -t 会输出一个或者 ssh 加 -q 参数  或者 2>/dev/null 屏蔽掉
1712.wget将页面内容输出到标准输出:
    wget -qO- http://shushu.com.cn/tm.php        # -qO- 相当于 -q  -O -
1713.iptables端口转发:将本地80端口的请求转发到8080端口,当前主机ip为192.168.2.1
    iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:8080
    ssh 或者 haproxy 之类的也可以做端口映射
1714.进程间通信方式:
    PIPE(FIFO)
    消息队列
    信号量(Semaphore)
    共享存储
    SOCKET
1715.线程间通信常用的三种方法:
    1.全局变量
        进程中的线程间内存共享,这是比较常用的通信方式和交互方式。
        注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。
    2.Message消息机制(windows下)
        常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage线程常常要将数据传递给另外一个线程。
        Worker线程可能需要告诉别人说它的工作完成了,GUI线程则可能需要交给Worker线程一件新的工作。
    3.CEvent对象(windows下)
        CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步。
1716.本机免key登录:
    ssh-keygen -t dsa -f ~/.ssh/id_dsa
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
1717.curl抓取http返回码:
    curl -so /dev/null -w ‘%{http_code}\n‘ www.sina.com
1718.ssh -D 一句话代理:
    alias proxy=‘expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- \"password\r\" ;  expect eof"‘
    alias proxy=‘expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- \"password\r\" ;  interact"‘
1719.ps -ww 不限制宽度输出:结果也与终端有关
    09:19:48#tp#~> ps -few|wc -L
    157
    09:19:50#tp#~> ps -feww|wc -L
    1326
    09:19:52#tp#~> echo $COLUMNS
    157
1720./dev/null 被cp,权限被修改:
    mknod -m 666 /dev/null c 1 3        # 创建特殊文件的,比如block或者是管道文件
1721.每 n 个字符截断换行的几种方法:
    echo 123190287923849241483971837103921|sed ‘s/..../&\n/g‘
    dd cbs=4 conv=unblock;    fold -c4;grep -Eo ‘.{1,4}‘
1722.awk输出到管道或者文件的时候有buffer,一般是4K,到达4K才输出,输出到标准输出没buffer
    i=0;while sleep 0.1;do echo -ne "\r"$((i++));done|awk ‘BEGIN{ORS=RS="\r"}{print $0}‘|tee a
    可以用这个测试下,如果去掉tee就可以正常显示,或者去掉awk也可以,两个都加上就不行,
    如果把sleep 0.1改成sleep 0.000001,到达4K的时候就会输出了,
    用fflush()可以刷新buffer
1723.od进行ascii到八进制、10进制、16进制的转换:
    printf "^A" | od -An -o # -b -x -d
1724.curl测试网络状况:
    curl -so /dev/null -w ‘%{http_code}‘ -H host:www.host.com 8.8.8.8/a.txt        #测返回码
    curl -sH host:www.host.com 8.8.8.8/a.txt    #下载文件测试
1725.paste -s串行合并文件内容:
    seq 100|paste -sd ‘    \n‘        #每5个换行
    echo {1..100}|xargs -n5            #xargs -n 效率比较低
    echo {1..100}|grep -Po ‘(\w+ ?){5}‘
1726.printf打印ascii的10进制值:
    printf ‘%d\n‘ \‘c        # \‘c 意思就是使用字符作为数字值
    awk 打印 ascii 对应 10 进制值:
    echo a|awk ‘BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$0]}‘
    打印ascii的16进制值:
    printf ‘%02x‘ "‘+"      # echo -n ‘+‘ | od -tx1 -An | tr -d ‘ ‘
1727.- 表示标准输入或者标准输出,用法举例:
    tar cvf - * | (cd  /dest/dir && tar xvfp -)            # - 需要程序自己支持,例如tar、cat,-可以理解为临时文件形式存在
    -在命令符当中表示标准输入或者标准输出。
    在tar cvf - *当中,表示标准输出,因为f参数后面跟的是输出的,
    这个命令的意思就是把当前目录的所有文件,tar打包到标准输出当中
    然后通过管道,这个命令的标准输出作为后面 (cd  /dest/dir && tar xvfp -)
    命令的标准输入,cd /dest/dir没有什么好说的,切换到那个目录。
    然后tar xvfp表示解压缩文件,但是没有指明是那个具体的文件?所以就是-了,
    表示标准输入当中获取文件,然后解压缩到当当前目录。
    总体来看,这个命令就是拷贝文件了。
1728.sub()与match()的搭配使用,可逐次取出原字串中合乎指定條件的所有子字符串:
    awk ‘BEGIN {
        data = "p12-P34 P56-p61"
        while( match( data ,/[0-9]+/) >0) {
           print substr(data,RSTART, RLENGTH)
           sub(/[0-9]+/,"",data)
        }
    }‘        #类似python re中的group或者正则中的捕获组
1729.巧用find的内置命令:delete、ls等:
    find -name "AAA" -ls    #同时减少了-exec执行fork带来的开销。
    find  . -name  AAA  \( -type f -exec ls -l {} \; -o -type d -exec ls -ld {} \; \)
1730.显示所有 ipv4:
    ip -o -4 a s
1731.printf -v 直接赋值变量:
    printf -v var ‘%%%02x‘ 111
1732.awk  FIELDWIDTHS 将字符串按指定域宽度划分:
    echo ‘23456.23478.58924.6‘ | awk -vFIELDWIDTHS="3 6 5 5" -vOFS="\t" ‘{$1=$1;print}‘
    echo ${A:0:3} ${A:3:6} ${A:9:5} ${A:14:5}
1733.查看 tcp 连接中 keepalive 的数量:
    netstat -town
1734.模拟骰子产生1~6的随机数:
    echo $((0x$(head -c5 /dev/random|xxd -ps)%6+1))
1735.pkill杀进程是模糊匹配,小心误杀:
    pkill aaa ,所有进程名里包含aaa的都会被干掉
    你可以用pgrep看看,进程名,不包含参数,你还可以指定tty、用户名什么的
    如果要精确匹配:pgrep -lx 类似 grep 的 -x 按行匹配
    -f 是不仅仅在进程里面查,参数也会查 ,就是你pkill -f apache,会把java -u apache也杀掉。默认是只看进程名是否匹配
    pgrep -fl 99
    27659 sleep 99
    -fx 是完整匹配整个命令行(进程名+参数) ,-x 是完整匹配进程名
1736.pkill 踢出who里的登录终端或者ip:
    pkill -kill -t pts/2
1737.得到10个字符的随机密码:
    tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
1738.perl列出当前目录下所有的符号链接:
    perl -e ‘print map { -l and $_ .= "\n" } <*>‘
1739.nnohup退出终端会断掉:
    shopt |grep huponexit
    grep -iR hup .bashrc .profile /etc/bash* /etc/profile*找下,反正我这没有,我是off
    默认值都是off的,开了就会出现他的那种问题,shell退出不应该给这个shell的子进程发HUP信号的,可以trap下。
1740.利用nc远程传输文件:
    tar -cf - * | nc 172.20.51.51 5555
1741.正则贪婪匹配陷阱:最左边的贪婪匹配优先级最高,后面的匹配都是基于正则的回溯机制,所以后面的都属于非贪婪匹配了。
    *虽然贪婪,但也可能发空匹配,因为他可以为0,而+至少匹配一次,限制较强。
    echo "房屋信息        房屋信息        1--district     190_360"|sed -r ‘s/(.*)([0-9]+)_([0-9]+)/=\1==\2===\3/‘
    =房屋信息        房屋信息        1--district     19==0===360
    echo "房屋信息        房屋信息        1--district     190_360"|sed -r ‘s/(.*)([0-9]*)_([0-9]*)/=\1==\2===\3/‘
    =房屋信息        房屋信息        1--district     190=====360
    echo "房屋信息        房屋信息        1--district     190_360"|sed -r ‘s/(.+)([0-9]+)_([0-9]*)/=\1==\2===\3/‘
    =房屋信息        房屋信息        1--district     19==0===360
    echo "房屋信息        房屋信息        1--district     190_360"|sed -r ‘s/(.*) ([0-9]+)_([0-9]*)/=\1==\2===\3/‘
    =房屋信息        房屋信息        1--district    ==190===360
1742.rsync -b 更新前先备份:
    rsync -b,然后--suffix指定后缀或者--backup-dir指定备份的目录,mv肯定比cp快,rsync的-b也是mv的
1743.windows下查询域名对应的所有服务器:
    nslookup -qt=mx web.qq.com
1744.vi一个远程文件:
    vi scp://[email protected]//path/to/somefile        #注意双斜线
1745.删除所有非打印字符:
    tr -dc ‘[:print:]‘ < filename
1746.PS1 设置putty等ssh工具的标签页 title:
    PS1=‘\[email protected]\h:\w\$ ‘
    # If this is an xterm set the title to [email protected]:dir
    case "$TERM" in
        xterm*|rxvt*)
            PS1="\[\e]0;\[email protected]\h: \w\a\]$PS1"
            ;;
        *)
            ;;
    esac
    或者:
    PROMPT_COMMAND=‘echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD}"; echo -ne "\007"‘
1747.tail -f 管道的buffer不能实时输出的问题:
    unbuffer -p tail -f .sh_histoy |awk ‘{print $0}‘
1748.利用 bc 计算器 obase 参数,实现十进制转二进制:
    echo ‘obase=2;98‘|bc
1749.为 man 指定阅读器 pager :less,并搜索指定字符串 034
    PAGER=‘less -iRsp034‘ man ascii
1750.vim中获取只读文件的sudo权限写入::w !sudo tee %
    命令:w !{cmd},让 vim 执行一个外部命令{cmd},然后把当前缓冲区的内容从 stdin 传入。
    tee 是一个把 stdin 保存到文件的小工具。
    而 %,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。
    所以执行这个命令,就相当于从vim外部修改了当前编辑的文件,然后从定向到当前文件。
    %! sudo tee % > /dev/null
    %         #VI/VIM编辑的文件内容
    !         #管道
    sudo    #以root权限操作
    tee     #
    %      #VI/VIM编辑的文件
    > /dev/null     #这里可省略
1751.查看linux版本的几种方法:
    cat /proc/version; uname -a; lsb_release -a; cat /etc/issue;
    cat /etc/redhat-release; rpm -q redhat-release
    file /bin/bash; file /bin/cat
1752.ls --time-style自定义时间格式显示:
    ls -lth --time-style=+"%F %T"
1753.去除vi打开文件时带的颜色及控制乱码字符:col -b
1754.sh 虽然链接到了 /bin/bash,但是 /bin/sh 执行效果不完全等同 /bin/bash,而是 /bin/bash --posix
    有很多系统里 gzip gunzip zcat 都指向一个inode, 同一程序对不同加载名作不同动作的用法在*nix中太常见了
1755.正则捕获示例:抓取网页上的 URL 链接:注意设置 LC_ALL 语言环境和字符集
    curl -s www.58.com.cn | sed -rn "s#.*(http://[0-9A-Za-z]*\.[^/\"?‘ ]*).*#\1#p"|sort|uniq -c|sort -k1rn
    curl -s www.qq.com | LC_ALL=C sed -rn "s#.*(http://\w*\.[[:alnum:].]*).*#\1#p"|sort|uniq -c|sort -k1rn
    上面的 sed 有一行上不能匹配多个网址的 bug,因为sed需要完全匹配后才能print,下面用 grep 修复该问题
    curl -s www.360buy.com | grep -Po ‘(https?://\w*\.[[:alnum:].]*)‘ |sort|uniq -c|sort -k1rn
    注:posix 字符类 [[:alnum:]] 等价于 [0-9A-Za-z],
    \w 为 [[:alnum:]_]的同义词,指单词字符,相当于 [0-9A-Za-z_],关于这点 man grep \w 中有前后矛盾的描述。
1756.sed单引号转义问题:
    sed单引号转义只支持16进制 \x27, 而且外层一定要加单引号或者双引号引起来:
    echo "1‘1"|sed -r ‘s/\x27//‘    # 不加引号那shell 会解释\x 成为 x,所以要养成加引号的习惯
    不支持8进制:echo "1‘1"|sed -r ‘s/\047//‘ ,而 awk 是两者都支持的。
    或者sed中用 "‘" 表示单引号
1757.用 bc -l 加载数学库做小数计算:
    echo 2/70|bc -l        #    echo 2/70|awk ‘{printf "%f", 2/70}‘
1758.locale 字符集语言环境的设置:
    echo http://wwAw.HA~12o.com|LC_ALL=C sed -rn "s#.*(http://([a-z]*)\.[^/\"?‘ ]*).*#\2#p"
    echo Aab|LC_ALL=C sed -r ‘s/[A-Z]//g‘
    注:有时候莫名其妙的问题一般与 LC_ALL=C 有关,C 是 POSIX,和具体语言无关。
    其实最好是C,这样sort排序会快很多,还有遇到[a-z]这种情况比较安全,还有 [.-/] 这种
1759.巧用 sed // 上次匹配功能排除边界值:
    echo -e "a\n2\nc"|sed ‘/a/,/c/{//!d}‘    # // 相当于awk中 !/^a|^c/
1760.shell中转换16进制到10进制:
     i=A; echo "obase=10;ibase=16;$i" | bc
     a=99 b=e8; (( 16#a > 16#b ))&&echo "a > b"||echo ‘a <= b‘
     echo $(printf "%d" 0xD)
1761.rsync 只同步目录(危险慎用!)
    "只" 同步目录,子目录的子目录也可以同步,但子目录里的文件不同步。
    rsync -av --delete -f ‘+ */‘ -f ‘- *‘ SRC/ DEST/    # -f ‘+ */‘是同步目录,-f ‘- *‘是不同步文件。
    想把子目录的内容也同步:
    rsync -av --delete -f ‘+ */‘ -f ‘- /*‘ SRC/ DEST/
1762.vim 粘贴板简介:
    vim 有 12个粘贴板 0、1、2、…、9、a、"、+;用:reg命令可以查看各个粘贴板里的内容。
    在vim中简单用y只是复制到 " (双引号)粘贴板里,p也这样。
    Ny完成复制到N号剪贴板,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),
    例如要把内容复制到粘贴板a,选中内容后按 "ay 就可以了,有两点需要说明一下:
    +号粘贴板是系统粘贴板,用"+y将内容复制到该粘贴板后可以使用Ctrl+V将其粘贴到其他文档(如firefox、gedit)中,
    同理,要把在其他地方用Ctrl+C或右键复制的内容复制到vim中,需要在正常模式下按 "+p,
    要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号,
    如上所述,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p将系统全局粘贴板里的内容粘贴进来。
1763.查看本机外网 ip:
    curl ifconfig.me
1764.awk 处理浮点数四舍五入的问题:
    ieee754 http://zh.wikipedia.org/zh-cn/IEEE_754
    $ echo "3.445"|awk ‘{printf "%0.2f\n",$0}‘
    3.44
    There is no ieee754 number for 3.445000000000000000000...
    $ echo "3.445"|awk ‘{printf "%0.20f\n",$0}‘
    3.44499999999999984013
    $ echo "3.4450000000000001"|awk ‘{printf "%0.20f\n",$0}‘
    3.44500000000000028422
    $ echo "3.44500000000000001"|awk ‘{printf "%0.20f\n",$0}‘
    3.44499999999999984013
1765.过滤掉 /etc/passwd 中的自动生成用户
    awk -F: ‘$0!~/nologin/&&($3=0||$3>=500)‘ /etc/passwd
1766.利用taskset有效控制cpu资源
    taskset -c 0 sh job.sh        #开启一个只用0标记的cpu核心的新进程(job.sh是你的工作脚本)
    taskset -pc 0 23328            #查找现有的进程号,调整该进程cpu核心使用情况
    可在top中进行负载check,最后你可以在你的工作脚本中加入该指令来合理利用现有的cpu资源
1767.关于 [^A-Za-z] 是否等价 [^A-z] 的问题:
    [^a-zA-Z] 是正则
    [!a-zA-Z] 是通配符
    用的地方不一样,而且A-z包含几个非字母字符,且用的时候还需要注意字符集
1768.校对大量文件的完整性:
    rsync 返回码或者 find打印大小,不要用du,du与FS的block大小设置有关,异构的FS中不准确
1769.登录linux,执行配置文件的顺序:
    /etc/profile -> [~/.bash_profile | ~/.bash_login | ~/.profile] -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
    在登录时,首先会执行/etc/profile,其次是用户目录下的.bash_profile,.bash_profile不存在则读取.bash_login,
    若.bash_profile和.bash_login都不存在,最后才读取.profile
1770.wget 带上浏览器 agent 下载:
    wget -c $url -O test2.flv -U    # --user-agent=AGENT
1771.ed 是真正的 inplace editing,sed 是假的 inplace editing,中间是生成了临时文件的。
1772.查看文件编码的 2 种方式:file -i 文件名    # vim 中 :set fileencoding
1773.根据进程名显示进程号: pidof java
1774.如何限制用户的最小密码长度:修改 /etc/login.defs 里面的PASS_MIN_LEN的值
1775.如何使新用户首次登陆后强制修改密码:useradd -p ‘‘ testuser; chage -d 0 testuser
1776.vi 编辑标准输入输出:crontab -l | vi -
1777.awk 利用协同进程监听指定端口:
    awk ‘BEGIN{service="/inet/tcp/2000/0/0"; service |& getline; print $0; close(service)}‘
1778. awk ‘FS=”:” {print $1,$3,$6}’ 明显不等价于 awk -F: ‘{print $1,$3,$6}’ ,
    前者是读取第一行记录并将记录分割成字段之后才进行FS的设置,FS=”:” 作为了模式,通常这样的写法是错误的.
    例如 awk ‘FS=":" {print $1,$3,$6}‘ /etc/passwd 会把第一个整行打印出来
1779.awk gensub 删除字段及其FS:
    echo 1 2 3 4 5|awk ‘{$4="";print gensub(FS,"",4)}‘
    echo 1 2 3 4 5|awk ‘{sub($4FS,"")}1‘
    echo "1 2 3    4    5"|awk ‘{$4="";$0=$0;$4=$4;print}‘
    注意 $1=$1;$4=$4 缺一不可,否则会有残留FS输出,$4=$4 在重构该域时会把周围多个 FS 合并,就像 echo 1    2 一样
1780.设置 PS1,根据上一个命令返回状态码控制显示红色还是绿色:
    `[ $? -eq 0 ]||echo \[\e[31m\]`
1781.判断程序输入来自文件还是标准输入:
    用 < 的话也是来自 - 的,不是来自文件
    15:18:17#tp#~> awk ‘END{print FILENAME}‘ <a
    -
    15:18:23#tp#~> cat a|awk ‘END{print FILENAME}‘
    -
    15:18:58#tp#~>
1782.查看dd命令的执行进度:
    dd if=/dev/zero of=/data3/test bs=1k count=1024000        # a 终端执行
    while killall -USR1 dd; do sleep 5; done                # b 终端执行
    然后就能看到间隔5秒一次的输出结果了,所执行的killall命令循环会在dd命令执行结束之后退出。
    为什么dd命令的进度输出要killall命令来激发呢?其实答案很简单,dd的进度输出就是这么设计的,
    再详细点就是dd命令在执行的时候接收到SIGUSR1信号的输出当前的读写进度,而killall命令在这里起的作用就是给dd进程发送这个信号。
    对于没有那些不与终端交互的守护进程(Deamon Process),通常的设计是在接收到SIGHUP信号之后就会重新读取配置文件。比如下面的:
    # 当你对smb.conf修改之后,运行下面的命令,修改就能生效了
    # 而不用再来一个smb restart
    killall -HUP smbd
1783.atime、ctime、mtime 区别与联系:
    atime:访问时间(access time),指的是文件最后被读取的时间,可以使用touch命令更改为当前时间;
    ctime:变更时间(change time),指的是文件属性最后被变更的时间,变更动作可以使chmod、chgrp、mv等等;
    mtime:修改时间(modify time),指的是文件内容最后被修改的时间,修改动作可以使echo重定向、vi等等;
    ctime 变动时不影响 mtime
    mtime 变动时 ctime 一起变。
1784.bc中十进制、二进制互转,ibase影响你所有的输入,
    14:53:49#tp#~> echo ‘ibase=10;obase=2;11‘|bc -l
    1011
    14:53:53#tp#~> echo ‘ibase=2;obase=10;11‘|bc -l    # 这里obase=10就是二进制
    11
    14:53:58#tp#~> echo ‘ibase=2;obase=1010;11‘|bc -l
    3
    14:55:21#tp#~> echo ‘ibase=2;obase=10;11‘|bc -l
    11
    14:58:59#tp#~> echo ‘obase=10;ibase=2;11‘|bc -l    # ibase影响你所有的输入,换个位置就不一样了
    3
    14:59:09#tp#~>
1785.nginx 的 logRotation 机制:
    mv access.log access.log.0
    kill -USR1 `cat master.nginx.pid`    # 发信号让进程写 access.log,而不是 access.log.0 老日志
    sleep 1
    gzip access.log.0    # do something with access.log.0
1786.linux 文件系统的一些限制:
    一级子目录限制个数:32000 (真正可以容纳的是31998个子目录,. 和 ..)
    文件名字符长度 255,中文 127
    文件个数:貌似没有限制
    注:不同的文件系统可能限制不一样,修改 kernel include file 然后 recompile 可以修改限制
1787.关于 find 不管找到与否都返回 0 的问题:因为默认是 find -print
    find -type f -name "123"
1788.管道是异步(并行)执行的:
    20:28:29#tp#~> sleep 999|sleep 998 &
    [1] 9239
    20:28:34#tp#~> ps -eo lstart,cmd|grep ‘sleep 99‘
    Mon Mar 18 20:28:33 2013 sleep 999
    Mon Mar 18 20:28:33 2013 sleep 998
    Mon Mar 18 20:28:35 2013 grep --color=auto sleep 99
    20:28:36#tp#~>
    sleep 999和sleep 998是同时启动的,并不是sleep 999执行完成,再执行sleep 998的
    管道前后的进程并发执行,不过这个还是会有一个时间差,这个看cpu的调度和负载。
    正因为如此,ps -fe|grep grep 不一定会有结果,而 ps -fe|grep init 一定有结果
    ps -fe|grep grep,可能是零个,也可能一个,不过大部分情况都是一个
    ps -fe|grep init,可能是一个,也可能是两个,不过大部分情况都是两个
1789.管道其实在操作内存:
    echo|ls -l /proc/self/fd/,结果里面的0 -> pipe:[1148917]就是管道文件
    或者ls -l /proc/self/fd/|cat,这样的话1是管道
    如果没有管道的话,应该是/dev/pts/4什么的
    self是你当前的pid,fd是这个进程的文件描述符,1148917 是匿名管道的文件名
1790.强大的进程匹配工具 pgrep:可依据多个属性匹配指定的进程
    如:pgrep -u root sshd
    pgrep -fl bash 等价 ps -eo pid,cmd|grep [b]ash
1791.nc 测网卡带宽:
    nc -l -p 1235 </dev/zero
    nc 127.0.0.1 1235 >/dev/null
    直接从/dev/zero读数据到1235端口,然后我的第二个nc从1235接手数据写到/dev/null,然后ifstat测试当前流量
    全部走内存,没有磁盘io,可以用eth测试,但是eth有危险,万一把网卡堵死,命令都执行不了。
1792.当 FS 为单个空格时,无论 RS 是否被重新定义,FS 始终都是 [ \t\n]+
    seq 3|awk ‘{$0=$0"\n#\n";print $1,$2}‘
1793.注意大括号命令组的用法:大括号前后空格 和 每条命令分号结束,否则提示命令未结束
    { sleep 1; continue; }
1794.lsof && test -s 检查文件写入完成,或者先写临时文件再 mv:
    chkFileWriteOver(){
        while [[ $c -le 3600 ]]
        do
            ((c++))
            # if file length > 0, it‘s ok.
            [[ -s $1 ]] || { sleep 1; continue; }
            lsof $1
            # if file not locked, it‘s ok.
            [[ $? -eq 1 ]] && echo "---------- File is OK ..." && break
            sleep 1
        done
        # here, if file is exception, you can send a email to somebody.
        [[ $c -eq 3600 ]] && echo "---------- File is not exsit ..."
    }
    chkFileWriteOver fileName
1795.shell的解释和编译引起的性能问题:
    for i in {1..10000}; do str="$str $i"; done
    # 这里是for慢,不是{1..10000}慢,你echo {1..10000}很快的
    解析 1次循环0.001秒 10次循环0.01秒 1000次循环1秒
    编译 1次循环0.001秒 10次循环0.002秒 1000次循环0.003秒
    编译其实就是那个意思,并不是那个比例,解析的话几次就是几倍
    可以认为编译 T(1),解释 T(n)
1796.find的路径问题:-newer 读取文件时间默认是在当前路径,因此需要显示 cd 或者 -newer 绝对路径
    find /tmp/mstat ! -newer `date -I -d‘3 days ago‘`
    find: 2013-03-24: 没有那个文件或目录
    cd /tmp/mstat; find /tmp/mstat ! -newer `date -I -d‘3 days ago‘`
    /tmp/mstat/2013-03-24
1797.sed 模式匹配//与模式替换s///的语法区别:
    当都是 / 做分隔符并无区别,但是当不是 / 的时候是有语法区别的:
    sed ‘\@/usr/local/[email protected]‘     # 第一个字符需要转义,man sed 语法如此,因为还可以被解析为行号
    sed ‘[email protected]/usr/local/[email protected]@‘    # 只能被解析为字符串内容,没有歧义
1798.iptables 的保存:
    /etc/init.d/iptables save就好了,保存到 /etc/sysconfig/iptables,启动自己会去读取的
    也可以手动 iptables-save > a.txt 或者 iptables-restore < a.txt
1799.curl 获取网页的状态码:
    http_code=`curl -I -s www.baidu.com -w %{http_code}` && echo ${http_code:9:3}
1800.awk中的隐式数据类型转换:
    awk ‘BEGIN{a="7868";if(a>=6211&&a<=10075)print "ok"}‘
    awk ‘BEGIN{a="56";if(a>=3&&a<=7189)print "ok"}‘
    结果不一致是由于在gawk中,数字和字符串同时比较会发生隐式类型转换,
    会把数字转换成字符串,然后按字符串排序(字典序),要想用数字比较,
    需要显示转换类型:a="7868"+0; 或者 a=int("7868");
    需要注意的是这样他只会转换以数字开头到第一个字母前的字符串
    如:
    echo |awk ‘{print "a12b"+0,"|",int("a12b"),"|","12b1"+0,"|",int("12b1")}‘
    0 | 0 | 12 | 12
    awk的sorti也是使用字符串做索引排序,需要注意
时间: 2024-10-05 19:27:06

shell 学习笔记1501-1800的相关文章

Shell学习笔记——第三章

第三章 /etc/passwd 文件包含一个所有系统用户账户组成的列表,以及一些关于每个用户的基本信息. 例rich:x:501:Rich Blum:/home/rich:/bin/bash 每个条目都有7个数据字段,例使用冒号分隔.系统使用这些字段中的数据向用户分配具体的特性.这些字段分别有 用户名:用户密码(如果密码存储在其他文件中,则为占位符):用户的系统用户ID编号:用户的系统组的ID编号:用户的全名:用户默认的主目录:用户的默认Shell目录: cd 命令 略过 列表命令(ls) 参数

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

SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here       elif list then           do another thing here       else          do something else here fi  EX1: #!/bin/bash if [ `uname -m` == "x86_64" ]

Linux Shell 学习笔记

2.return与exit区别 return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用. exit(0)表示正常退出执行程序,如果加其它的数值:1,2,....可以表示由于不同的错误原因而退出 . main函数中exit(0)等价于return 0. 1. Linux下一条命令或一个进程执行完成会返回一个一个状态码. 0 === 成功执行 非0 === 执行过程

shell学习笔记

一.shell变量 1.变量名与赋值符号间不能有空格. 2.首个字符必须为字母a~z或A~Z. 3.使用一个已定义的变量,在变量名前加'$',如: myName=“firefly” echo $myname echo ${myName} 加花括号帮助识别变量的边界,建议加上s. 4.删除变量:unset varName,不能删除只读变量. 5.三种变量:局部变量.环境变量.shell变量 二.shell替换 1.变量替换 echo -e "hello, Emma!\n" 若无-e,则不

[Bash Shell] Shell学习笔记

1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. 它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序.建立文件并以并行的方式协调各个程序的运行.因此,对于用户来说,s

shell学习笔记之六(测试和判断)

测试和判断 测试 利用命令执行后的$?来判断命令是否执行正常.$?==0 ? 正常:错误 测试结构: 1.test expression 2.[ expression ] #注意表达式两侧的空格 方式2增加了代码的可读性,且更容易与if,case,while这些条件判断的关键字联用. 文件测试: 1.test file_operator FILE 2.[ file_operator FILE ] 例: test -e /var/log/message echo $? #文件存在返回0,不存在返回

shell学习笔记---抄录

SHELL笔记 1.查看一个文件或目录的大小 ls   du 2.查看状态     stat 文件名 3.系统本身所有,通常为大写字母 4.系统变量通过 set 或 declare 指令进行查看 5.UDV 变量(user defined variable) 用户创建和维护,建议大写(为什么?) 原因:避免冲突与混淆,因为 Linux 系统中命令全部采用小写的方式 6.Shell 中所有变量定义都为字符串. 变量区分大小写,如:foo 和 Foo 是两个不同的变量 变量必须以字母或下划线开头,不

CentOS 7 之Shell学习笔记

脚本是个永恒的话题,以前Dos下面也有Shell编程这一说的,比如说BAT文件有人写的好的话,也是瞬间速度变高大上.Linux下面这个应该更占比重了.我看到园子里有位园友做了一个Linux Shell脚本攻略 读书笔记,笔记概括总结的太好了,值得逐一实践. 为学Linux ,我读过的书藉, 这篇也是个不错的总结,前人的经验真是宝贵,分享真是一种态度.

shell 学习笔记整理(二)

特殊字符:    #! 开始的标志    ;  多个命令一起连用的分隔符    [[email protected] log]# echo a;echo b;echo c    a    b    c    .  多种作用:        1. 相当与 source 命令        2. 作为文件名称的一部分(隐藏文件名)  (使用ls -a  可以查看linux下面的隐藏文件)        3.如果作为目录名的话,一个单独的点代表当前工作目录,两个点代表上一级目录.