2019年1月

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程: 依次对每一行进行处理,然后输出
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
 [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
'  '          引用代码块
BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
//           匹配代码块,可以是字符串或正则表达式
{}           命令代码块,包含一条或多条命令
;          多条命令使用分号分隔
END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
 
特殊要点:
$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
\t            制表符
\n           换行符
FS          BEGIN时定义分隔符
RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==         等于,必须全部相等,精确比较
!=           不等于,精确比较
&&      逻辑与
||             逻辑或
+            匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符
 
print & $0
print 是awk打印指定内容的主要命令
awk '{print}'  /etc/passwd   ==   awk '{print $0}'  /etc/passwd  
awk '{print " "}' /etc/passwd                                           //不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
awk '{print "a"}'   /etc/passwd                                        //输出相同个数的a行,一行只有一个a字母
awk -F":" '{print $1}'  /etc/passwd 
awk -F: '{print $1; print $2}'   /etc/passwd                   //将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd        //输出字段1,3,6,以制表符作为分隔符

原文

这是之前开发的一个项目的时候写的,脚本批量将目录里的视频批量的截图 ,用到了 ffmpeg 转码工具
截图脚本事例:

#!/bin/bash

run_ls(){
        pwd;

        for x in $(ls -l| grep ".mp4$" | awk '{print $9}')
        do
            echo $x
            ffmpeg -y -i $x -frames 1 -f image2 $x".jpg"
        done
}

myfunc(){
        cd $1;
        #run_make;
        run_ls;

        for x in $(ls .)
        do
                if [ -d "$x" ];then
                        myfunc $x;
                        cd ..
                fi

        done
}

p=.
if [ $1 ];then
    p=$1
fi
echo $p

myfunc $p

转码并上传到OSS:

<?php /**
 * ===================================
 * @author      Joyber
 * @date        04/26/2018
 * ===================================
 */

namespace app\api\sell;

use OSS\OssClient;
use util\Redis;
use wumashi\core\Conf;
use wumashi\core\Db;

require "./_shell.php";

include_once ROOT . 'vendor/aliyun/core/Config.php';
include_once ROOT . 'vendor/aliyun/aliyun-oss.phar';

set_time_limit(0);
define('UPLOAD_PREFIX', 'http://file.www.cn/');
define('UPLOAD_PATH', '/data/upload/');
define('USLEEP_TIME', 4e5);


if (!function_exists('exec')) {
    outmsg('ERROR: exec function not exists');
    exit(1);
}

$config = Conf::get('app', 'alioss');
//var_dump($config);
//$clientProfile = \DefaultProfile::getProfile(...$config);

$ossClient = new OssClient($config['accessKey'], $config['accessSecret'], $config['endpoint']);
$redis = Redis::getInstance();
$db = Db::getInstance();

//上传文件
//$ossClient->putObject($config['bucket'], 'test/test.bat', ROOT . 'wepy.bat');

//列举文件
//$option = ['prefix'=>'20180427/46c12c6858875fbab7c0956ab1a9ab28.mp4'];
//$listObjectInfo = $ossClient->listObjects($config['bucket'], $option);
//$objectList = $listObjectInfo->getObjectList();
//if (!empty($objectList)) {
//    foreach ($objectList as $objectInfo) {
//        print($objectInfo->getKey() . "\t" . $objectInfo->getSize() . "\t" . $objectInfo->getLastModified() . "\n");
//    }
//}

$key = 'task_for_ts';

function uploadDir($dirname) {
    global $config, $ossClient;
    foreach (scandir($dirname) as $file) {
        if (!in_array($file, [".", ".."])) {
            $filepath = $dirname . '/' . $file;
            if (is_dir($filepath)) {
                uploadDir($filepath);
                continue;
            }
            $object = str_replace(UPLOAD_PATH, '', $filepath);
            outmsg("upload OSS : {$object} => {$filepath}");

            $res = $ossClient->uploadFile($config['bucket'], $object, $filepath);
            outmsg($res);
        }
    }
};

while (true) {

    if (time() > WMS_TIME + 1800) {
        exit(1); //退出为1,无限重启,0 将不再启动
    }


    $filename = $redis->lPop($key);
    if (!$filename) {
        usleep(USLEEP_TIME);
        continue;
    }

    if (!file_exists($filename)) {
        outmsg('file not exists: '. $filename);
        usleep(USLEEP_TIME);
        continue;
    }

    //执行转码任务
    $pathinfo = pathinfo($filename);
    $dir = $pathinfo['dirname'] . '/' . $pathinfo['filename'];
    if (file_exists($dir)) {
        //已经转码过了,跳过
        outmsg('jump: ts dir exists: '. $dir);
        usleep(USLEEP_TIME);
        continue;
    }

    //创建目录
    mkdir($dir, 0777, true);

    $tsfilename = $dir . '/ts.m3u8';
    $picfilename = $tsfilename.'.jpg';
    $cmd = "ffmpeg -i {$filename} -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls {$tsfilename}";
    //重新截图命令
    $piccmd = "ffmpeg -y -i {$filename} -frames 1 -f image2 {$picfilename}";
    outmsg("{$filename} => {$cmd}");

    //必需开启exec函数
    @exec($cmd, $res, $status_code);
    if ($status_code != 0) {
        //错误
        outmsg("Error res: [{$status_code}]" . serialize($res));
        $redis->lPush($key.'_retry', $filename);
        continue;
    }

    @exec($piccmd);
    $ourl = str_replace(UPLOAD_PATH, UPLOAD_PREFIX, $filename);
    $url = str_replace(UPLOAD_PATH, UPLOAD_PREFIX, $tsfilename);

    $db->insert('tsfile', [
        'md5' => md5($ourl),
        'ourl' => $ourl,
        'url' => $url,
    ]);

    //上传切片目录文件
    uploadDir($dir);

    usleep(USLEEP_TIME);
}

安装文章

ffmpeg: error while loading shared libraries: libavdevice.so.58

需要注意的是,如果你是自定义安装目录的话,安装好执行时可以报以下错误:
ffmpeg: error while loading shared libraries: libavdevice.so.58:
cannot open shared object file: No such file or directory

解决办法:
此情况是因为ffmpeg未找到相关依赖包,可以通过以下方法解决
先 find / -name libavdevice.so.58 得到该文件的目录地址,
然后 vim /etc/ld.so.conf 将上述目录(比如:/usr/local/ffmpeg/lib/)添加到最后一行并保存退出;
再 ldconfig 使配置生效,即可;

如果执行 ldconfig: command not found

export PATH=”$PATH:/sbin”

.van-doc-nav::-webkit-scrollbar {
    height: 6px;
    width: 6px;
    background-color: transparent;
}
.van-doc-nav:hover::-webkit-scrollbar-thumb {
    background-color: rgba(69,90,100,.2);
}
.van-doc-nav::-webkit-scrollbar-thumb {
    border-radius: 6px;
    background-color: transparent;
}