gwarah
gwarah
Reputation Top 1%
Luis Pessoa
IT Professional coding in html5/javascript/css, shell script, awk, SQL, PL-SQL, etc
12 Snippets  (68th place)
Published
1 Channel
Created
7 Channels
Following
341 points  (90th place)
Reputation
Top 10% Publisher
Junior Code Generator
Serious Code Generator
Junior Publisher
Serious Publisher
Junior Trend Maker
Serious Trend Maker
Junior Popular Coder
Serious Popular Coder
Junior Autobiographer
Serious Autobiographer
Master Autobiographer
Junior Snip2Coder
Junior Famous Coder

Recent Snippets See all snippets by gwarah

public by gwarah  38  1  3  0

Echo with system date

syntax: lux_echopad.sh [-m ] [-t ] text # # tests without exported variables # lxf_echodate one lxf_echodate -t WARNING two lxf_echodate -m '%d/%m/%Y' -t ALERT three lxf_echodate back to one # # outputs # # 18/02/2020 14:19:43;one # 18/02/2020 14:19:43;WARNING;two # 18/02/2020;ALERT;three # 18/02/2020 14:19:44;back to one
#!/bin/bash
# File       : lux_echodate.sh
# Goal       : echo <date>;[<tags>;]<text>
# Requisites :
#     1. SHELL=bash
# Syntax     : lux_echopad.sh [-m <datemask>] [-t <tag>] text
# History    :
#   #version;date;description
#   0.1.0b; __/02/2020; first beta
#   0.0.1dr; 18/02/2020; first draft
#

#
# use these snippet to modify the datemask and tags default
#
# export LXV_ECHODATE_MASK='%d/%m/%Y %H:%M:%S'
# export LXV_ECHODATE_TAG='ALERT'
#
function lxf_echodate {
    #
    # default values: datemask and tag
    #
    local p_datemask=${LXV_ECHODATE_MASK:='%d/%m/%Y %H:%M:%S'}
    local p_tag=${LXV_ECHODATE_TAG:=""}
        
    # others vars
    local v_aux
        
    #
    # getopts 
    #
    local OPTIND=1
    local list_opt=""
    local opt_found=0
    while getopts ":m:t:" pkey; do
        # verifica se chave já foi chamada
        # excluir chaves que foram chamadas mais de uma vez
        echo "${list_opt}" | grep -q $pkey
        if [ $? -eq 0 ]; then
            echo "Not allowed more than one parameter -${pkey} " ; exit 1
        fi
    
        # atualiza controle de chaves executadas
        (( opt_found++ ))
        list_opt="${list_opt};${pkey}"
    
        case $pkey in
        m)  # datemask
            v_aux="${OPTARG}"
            if [ ${#v_aux} -eq 0 -o "${v_aux:0:1}" = "-" ]; then
                echo "datemask cannot be empty" ; exit 1
            fi
            p_datemask="${v_aux}"
            
            # update the mask default
            # LXV_ECHODATE_MASK="${p_datemask}"
            ;;
        t)  # tag
            v_aux="${OPTARG}"
            if [ ${#v_aux} -eq 0 -o "${v_aux:0:1}" = "-" ]; then
                echo "tag cannot be empty" ; exit 1
            fi
            p_tag="${v_aux}"
            
            # update the tag default
            # LXV_ECHODATE_TAG="${p_tag}"
            ;;
        \?)
            echo "Opção inválida -${OPTARG}"; exit 1
            ;;
        esac
    done
    
    # shift positional parameters
    [ $OPTIND -gt 1 ] && shift `expr $OPTIND - 1`
    p_text="$@"
    
    # echo
    echo "$(date "+${p_datemask}")${p_tag:+;${p_tag}};${p_text}"
}
						
;

public by gwarah  24  0  3  0

Echo text padded

This shell function output a echo of a text "padded" with a char. The user can choose the length and the char when calling the function. Syntax : lux_echopad.sh [-l ] [-c ] After installed in your system test the function with the examples at the end of code
#!/bin/bash
# File       : lux_echopad.sh
# Goal       : echo a text "padded" with a char
# Requisites :
#     1. SHELL=bash
# Syntax     : lux_echopad.sh [-l <line_length>] [-c <char>]
# History    :
#   #version;date;description
#   0.1.0b; 18/02/2020; first beta
#   0.0.1dr; 03/02/2020; first draft
#

#
# use these snippet to modify the datemask and tags default
#
# export LXV_ECHOPAD_LENGTH=60
# export LXV_ECHOPAD_PADCHAR='-'
#

function lxf_echopad {
    #
    # default values: line length and padding char 
    #
    local p_linelength=${LXV_ECHOPAD_LENGTH:=60}
    local p_padchar=${LXV_ECHOPAD_PADCHAR:='-'}
    local p_text=""
    
    # others vars
    local v_aux
    local vt_pad
    local v_mod
    local v2_pad
    
    #
    # getopts 
    #
    local OPTIND=1
    local list_opt=""
    local opt_found=0
    while getopts ":l:c:" pkey; do
        # verifica se chave já foi chamada
        # excluir chaves que foram chamadas mais de uma vez
        echo "${list_opt}" | grep -q $pkey
        if [ $? -eq 0 ]; then
            echo "Not allowed more than one parameter -${pkey} " ; exit 1
        fi
    
        # atualiza controle de chaves executadas
        (( opt_found++ ))
        list_opt="${list_opt};${pkey}"
    
        case $pkey in
        c)  # padding char
            v_aux="${OPTARG}"
            if [ ${#v_aux} -ne 1 ]; then
                echo "char parameter invalid: ${v_aux}" ; exit 1
            fi
            p_padchar="${v_aux}"
            ;;
        l)  # line length
            v_aux="${OPTARG}"
            if ! [[ ${v_aux} =~ ^[0-9]+$ ]]; then    
                echo "length parameter must be a integer: ${v_aux}" ; exit 1
            fi
            
            if [ ${v_aux} -lt 9 ]; then
                echo "length parameter must be greater than 10: ${v_aux}" ; exit 1
            fi
            p_linelength=${v_aux}
            ;;
        \?)
            echo "Opção inválida -${OPTARG}"; exit 1
            ;;
        esac
    done
    
    # shift positional parameters
    [ $OPTIND -gt 1 ] && shift `expr $OPTIND - 1`
    p_text=$1
    
    if [ ${#p_text} -ge ${p_linelength} ]; then
        echo "${p_text}"
    else
        let vt_pad=${p_linelength}-${#p_text}
        let v_mod=${vt_pad}%2
        let v2_pad=${vt_pad}/2
        
        # left pad
        let v_aux=$v2_pad+$v_mod
        v_stl=`for k in $(seq 1 $v_aux);do printf ${p_padchar};done`
        
        # right pad
        let v_aux=$v2_pad
        v_str=`for k in $(seq 1 $v_aux);do printf ${p_padchar};done`
        
        echo "${v_stl}${p_text}${v_str}"
    fi
}


#
# tests without exported variables
#
lxf_echopad " first "
lxf_echopad -l 40 " second "
lxf_echopad -c '=' -l 50 " third "
lxf_echopad " first again "

#
# tests with exported variables
#
export LXV_ECHOPAD_LENGTH=65
export LXV_ECHOPAD_PADCHAR='x'

lxf_echopad " first "
lxf_echopad -l 40 " second "
lxf_echopad -c '=' -l 50 " third "
lxf_echopad " first again "
;

public by gwarah  96  1  5  0

Validação de CPF/CNPJ em HTML

Este snippet é usado para teste de outro snippet que contém as classes javascript Cpf e Cnpj. Busque por "Validação de CPF/CNPJ em javascript" no meu canal.
<html>
<head>
	<title>validação de CPFs/CNPJ</title>
</head>
<body>
    <!-- included this snippet -->
    <script src="cnpj_cpf.js"></script>
<script type="text/javascript">

    function WinLoad() {
        document.getElementById("bt_cpf").addEventListener("click", validar_cpf, false);
        document.getElementById("bt_cnpj").addEventListener("click", validar_cnpj, false);
    }
    
    window.onload = WinLoad;
    
    // validação de CPF
    function validar_cpf() {
        let p_cpf=document.getElementById("txt_cpf").value;
        let v_cpf=new Cpf(p_cpf);
        // alert("cheguei aqui" + p_cpf);
        v_cpf.validar();
        document.getElementById("div_resultado_cpf").innerHTML = v_cpf.show_status();
        return true;
    }
    
    // validação de CNPJ
    function validar_cnpj() {
        let p_cnpj=document.getElementById("txt_cnpj").value;
        let v_cnpj=new Cnpj(p_cnpj);
        // alert("cheguei aqui" + p_cnpj);
        v_cnpj.validar();
        document.getElementById("div_resultado_cnpj").innerHTML = v_cnpj.show_status();
        return true;
    }
</script>

<p>Validação do CPF/CNPJ</p>

<p>
CPF: 
<input type="text" id="txt_cpf" value=""> 
<input type="button" id="bt_cpf" value="Validar">
</p><br>
<div id="div_resultado_cpf">não validado</div>

<p>
CNPJ: 
<input type="text" id="txt_cnpj" value=""> 
<input type="button" id="bt_cnpj" value="Validar">
</p><br>
<div id="div_resultado_cnpj">não validado</div>

</body>
</html>
																																																						
;

public by gwarah  105  2  4  0

Validação de CPF/CNPJ em javascript

Classes em javascript para validação de números de CPFs e CNPJs. Requisitos: browser ou ferramenta deve suportar a ECMAScript® 2015 Language Specification Obs:Em outro snippet há o código HTML para testar estas classes
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Arquivo      : cnpj_cpf.js
 * Observações  :
 *   #version;date;description
 *   0.1.0;20/12/2019; versão beta1
 */

/**
 * Class: Cpf
 * version: 0.1.0;18/12/2019
 */
 
class Cpf {
    /* constructor */
    constructor(p_cpf) {
        
        // validações iniciais
        if ( typeof p_cpf !== 'string' ) {
            throw "Parâmetro p_cpf " + p_cpf + " deve ser do tipo string!";
        }
        
        // retira não numéricos
        p_cpf = p_cpf.replace(/\D/g,'');
               
        /* attributes */
        this._cpf = p_cpf;   // retira não numéricos
        this._er = /^[0-9]{11}$/;
        this._er_mask = /^[0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}$/;
        this._status = 0;   // 0-não testado;1-válido;2-inválido
    }


    /* getters and setters */
    get cpf() {
        return this._cpf;
    }
    
    set cpf(p_cpf) {
        // validações iniciais
        if ( typeof p_cpf !== 'string' ) {
            throw "Parâmetro p_cpf " + p_cpf + " deve ser do tipo string!";
        }
        
        // retira não numéricos
        p_cpf = p_cpf.replace(/\D/g,'');   // retira não numéricos
        
        // atribuição
        this._cpf = p_cpf;
        this._status = 0;
    }

    get status() {
        return this._status;
    }

    /* others methods */
    validar() {
       this._status = ( this._validarCpf(this._cpf) ? 1 : 2);
       return ( this._status == 1 ) ? true : false;
    }

    show_status() {
        let str_out='CPF: ' + this._cpf + ' - status: ' + this._status;
        console.log(str_out);
        return str_out;
    }

    /* functions */
        
    //
    // validação de CPF
    //
    _validarCpf(p_cpf) {

        //
        // testes iniciais: descarta nulos, não strings e string que não é numérica de 11 dígitos
        //

        if ( typeof p_cpf !== 'string' ) { return false; }

        if ( ! ( this._er.test(p_cpf)) ) { return false; }

        //
        //  regra de validação do CPF
        //

        // quebra o CPF em 2 partes
        let cpf9digs=p_cpf.substring(0,9);
        let cpf2digs=p_cpf.substring(9,11);

        let soma=0;
        let digv="";
        let digv1=0;
        let digv2=0;
        let p=0;
        let dig=0;
        let mod11soma=0;

        // obtenção do primeiro dígito
        for(p=10;p>=2;p--) {
            dig=parseInt(cpf9digs.charAt(10-p));
            soma+=p*dig;
        }
        mod11soma = soma % 11;
        digv1=(mod11soma<2) ? 0 : (11-mod11soma);

        // obtenção do segundo dígito
        let cpf10digs= "" + cpf9digs + digv1;
        soma=0;
        digv2=0;
        for(p=11;p>=2;p--) {
            dig=parseInt(cpf10digs.charAt(11-p));
            soma+=p*dig;
        }
        mod11soma = soma % 11;
        digv2 = (mod11soma<2) ? 0 : (11-mod11soma);

        // dígito verificador completo
        digv= "" + digv1 + digv2;

        return (( digv === cpf2digs ) ? true : false);
    }
}

/**
* Class: Cnpj
* version: 0.1.0;18/12/2019
*/
class Cnpj {

    /* getters and setters */
    constructor(p_cnpj) {
        
        // validações iniciais
        if ( typeof p_cnpj !== 'string' ) {
            throw "Parâmetro p_cnpj " + p_cnpj + " deve ser do tipo string!";
        }
        
        // retira não numéricos
        p_cnpj = p_cnpj.replace(/\D/g,'');

        /* attributes */
        this._cnpj = p_cnpj;
        this._er = /^[0-9]{14}$/;
        this._er_mask = /^[0-9]{2}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}\-?[0-9]{2}$/;
        this._status = 0;   // 0-não testado;1-válido;2-inválido
    }

    /* getters and setters */
    get cnpj() {
        return this._cnpj;
    }

    set cnpj(p_cnpj) {
        // validações iniciais
        if ( typeof p_cnpj !== 'string' ) {
            throw "Parâmetro p_cnpj " + p_cnpj + " deve ser do tipo string!";
        }
        
        // retira não numéricos
        p_cnpj = p_cnpj.replace(/\D/g,'');
        this._cnpj = p_cnpj;
    }

    /* others methods */
    get status() {
        return this._status;
    }

    /* others methods */
    validar() {
       this._status = ( this._validarCnpj(this._cnpj) ? 1 : 2);
       return ( this._status == 1 ) ? true : false;
    }

    show_status() {
        let str_out='CNPJ: ' + this._cnpj + ' - status: ' + this._status;
        console.log(str_out);
        return str_out;
    }

    /* functions */
        
    //
    // validação de CPF
    //
    _validarCnpj(p_cnpj) {
        //
        // testes iniciais: descarta nulos, não strings e string que não é numérica de 11 dígitos
        //
        
        if ( typeof p_cnpj !== "string" ) { return false; }
    
        let ereg = new RegExp('^\\d{14}$');
        if ( ! ( ereg.test(p_cnpj)) ) { return false; }
    
        //
        //  regra de validação do CNPJ
        //
        
        // quebra o CPF em 2 partes
        let cnpj12digs=p_cnpj.substring(0,12);
        let cnpj2digs=p_cnpj.substring(12,14);
        
        let soma=0;
        let digv1=0;
        let digv2=0;
        let dig=0;
        let p=0,i=0;
        let digv="";
        let mod11soma=0;     
    
        //
        // regra de validação do CNPJ
        //
        
        // obtenção do primeiro dígito
        soma=0;
        digv1=0;
        p=2; // peso inicial
        for(i=12;i>=1;i--) {
            dig = parseInt(cnpj12digs.charAt(i-1));
            soma += p * dig;
            p= (p==9) ? 2 : (p+1);
        }
        mod11soma = soma%11;
        digv1= (mod11soma<2) ? 0 : (11-mod11soma);
    
        // obtenção do segundo dígito
        let cnpj13digs="" + cnpj12digs + digv1;
        soma=0;
        digv2=0;
        p=2; // peso inicial
        for(i=13;i>=1;i--) {
            dig=parseInt(cnpj13digs.charAt(i-1));
            soma += p * dig;
            p=(p==9) ? 2 : (p+1);
        }
        mod11soma=soma%11;
        digv2=(mod11soma<2)?0:(11-mod11soma);
        
        // dígito verificador completo
        digv="" + digv1 + digv2;
        
        return (( digv == cnpj2digs ) ? true : false);
    }
}

																																																
;

public by gwarah  88  0  4  0

Validação de CPF/CNPJ em awk/bash

Validação de CPF/CNPJ em awk. Para testar, no shell digite: echo | awk -f cnpj_cpf.awk echo $? Obs: 1. pode ser passada uma lista de CPFs ou CNPJs, um em cada linha da entrada padrão 2. o script retorna 0 se todos os CPFs/CNPJs forem válidos, do contrário retorna 1 Obs: testado no cygwin
#!/usr/bin/awk
# Arquivo    : cnpj_cpf.awk
# Objentivo  : funções para validação de CPF e CNPJ
# Requisites :
#     1. SHELL=bash
#     
# History    :
#   #version;date;description
#   0.1.1b; 23/12/2019; retorna 1 pelo menos um CPF da lista for inválido
#   0.1.0b; 23/12/2019; first release 
#

#
# Tested: cygwin environment
# 

# verificação de CPF
function check_cpf(p_cpf) {
  
    # comprimento deve ter onze posições
    if (! ( p_cpf ~ /^[[:digit:]]{11}$/ )) { return FALSE; }
    
    ###
    # regra de validação do CPF
    ###
    
    # quebra o CPF em 2 partes
    cpf9digs=substr(p_cpf,1,9);
    cpf2digs=substr(p_cpf,10,2);
    
    # obtenção do primeiro dígito
    soma=0;
    digv1=0;
    for(p=10;p>=2;p--) {
       dig=substr(cpf9digs,(11-p),1);
       soma+=p*dig;
    }
    mod11soma=soma%11;
    digv1=(mod11soma<2)?0:(11-mod11soma);
        
    # obtenção do segundo dígito
    cpf10digs=cpf9digs digv1;
    soma=0;
    digv2=0;
    for(p=11;p>=2;p--) {
       dig=substr(cpf10digs,(12-p),1);
       soma+=p*dig;
    }
    mod11soma=soma%11;
    digv2=(mod11soma<2)?0:(11-mod11soma);
    
    # dígito verificador completo
    digv=digv1 digv2;
    
    return (( digv == cpf2digs ) ? TRUE : FALSE);
}

# verificação de CNPJ
function check_cnpj(p_cnpj) {
       
    # comprimento deve ter onze posições
    if (! ( p_cnpj ~ /^[[:digit:]]{14}$/ )) { return FALSE; }
    
    ###
    # regra de validação do CNPJ
    ###
    
    # quebra o CNPJ em 2 partes
    cnpj12digs=substr(p_cnpj,1,12);
    cnpj2digs=substr(p_cnpj,13,2);
    
    # obtenção do primeiro dígito
    soma=0;
    digv1=0;
    p=2; # peso inicial
    for(i=12;i>=1;i--) {
       dig=substr(cnpj12digs,i,1);
       soma+=p*dig;
       p=(p==9)?2:(p+1);
    }
    mod11soma=soma%11;
    digv1=(mod11soma<2)?0:(11-mod11soma);
  
    # obtenção do segundo dígito
    cnpj13digs=cnpj12digs digv1;
    soma=0;
    digv2=0;
    p=2; # peso inicial
    for(i=13;i>=1;i--) {
       dig=substr(cnpj13digs,i,1);
       soma+=p*dig;
       p=(p==9)?2:(p+1);
    }
    mod11soma=soma%11;
    digv2=(mod11soma<2)?0:(11-mod11soma);
       
    # dígito verificador completo
    digv=digv1 digv2;
    
    return (( digv == cnpj2digs ) ? TRUE : FALSE);
}

#
# Variáveis devem ser declaradas neste bloco
#
BEGIN {
    # boolean values
    TRUE=1;
    FALSE=0;
    
    # retorna TRUE caso pelo menos um CPF/CNPJ da lista for inválido
    p_retorno=TRUE;
}
{
    p_valor=$0;
    p_flag=0;
    
    # se for CPF
    if ( p_valor ~ /^[[:digit:]]{11}$/ ) {
        p_flag=1;
        printf "CPF " p_valor " -  resultado: "; 
        if ( check_cpf(p_valor) == TRUE ) { print "válido";}
        else { 
            p_retorno=FALSE;
            print "inválido";
        }
    }
    
    # se for CNPJ
    if ( p_valor ~ /^[[:digit:]]{14}$/ ) {
        p_flag=1;
        printf "CNPJ " p_valor " -  resultado: "; 
        if ( check_cnpj(p_valor) == TRUE ) { print "válido";}
        else { 
            p_retorno=FALSE;
            print "inválido";
        }
    }
    
    # se não for CPF ou CNPJ
    if ( p_flag == 0 ) {
        p_retorno=FALSE;
        printf p_valor " não é nem CPF nem CNPJ "; 
    }
}
END {
    exit p_retorno;
}						
;