首页 > 编程语言 >python -c 执行单行命令或脚本

python -c 执行单行命令或脚本

时间:2022-10-24 21:55:38浏览次数:43  
标签:脚本 python 单行 json import print world os

python -c 执行单行命令或脚本

背景:

最新在编写 shell 脚本实现数据库的自动巡检功能,在某些巡检项需要处理 json 类型的数据。使用不擅长处理字符串的 shell来处理 json, 各种awk  sed grep 搞下来差点脑溢血。最后还是解析不了复杂的 json。一通查资料,搞到如下三种方案:

1、安装 jq 工具,使用 jq 来解析。弊端,生产环境可能没有 jq

2、使用 awk sed,利用正则匹配进行切割

3、借助第三方解析器,如python php 等

方案一:

比较好用,需要安装 jq。jq 的使用自行百度

方案二:

优点是无需额外的依赖,缺点是有些 JSON 格式无法正常获取,需要根据实际情况修改相关的正则或命令参数。各种复杂的正则匹配。

function get_json_value()
{
  local json=$1
  local key=$2
 
  if [[ -z "$3" ]]; then
    local num=1
  else
    local num=$3
  fi
 
  local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p)
 
  echo ${value}

方案三:

虽然 bash/sh 没有专门处理 JSON 的功能,但是其他脚本解释器通常都是有的,比如 Python、php。本文介绍一下 python, 强大的 python 从未让人失望。

shell 调用python解析json 数据

刚开始笔者的想法是单独写一个python 脚本来解析 json 数据,然后在 shell 中再调用这个python 脚本。这样有个弊端是,一个巡检脚本要拆分成两个,shell 接收 python 返回的解析后的数据再次进行处理。在经过一番搜索之后,发现python提供了 -c 参数,可以在 bash 终端直接执行指令。

例如:

python -c "import os;print('hello'),print('world')"
python -c "import os;print('hello');print('world')"

要用双引号将命令包起来,import要以**;结尾,命令用[]括起来,多行命令用多个[]**

python -c "import os,time;[print(i) for i in os.listdir()];[print(time.time())]"
python -c "import os,time;[print(i) for i in os.listdir()],[print(time.time())]"

复杂的命令必须要用**[]**括起来,否则会报错。格式上还可以多尝试一下:

python -c "print('hello');print('world')"
python -c "print('hello'),print('world')"
python -c "[print('hello'),print('world')]"
python -c "[print('hello')],[print('world')]"

以上命令在 python3 的版本可以正常执行

但是当发现了新大陆,兴高采烈的去使用的时候。发现服务器上安装的是 python2 版本。部分格式根本执行不通,wtf!!!

再次经过一番资料查询,在 python2 中同样找到了替代方案:

python -c "exec(\"n = 3\nfor i in range(n):\n  print(i)\")"

或者可以插入真正的新行:

$ python2 -c "n = 3
> for i in range(n):
>   print(i)"
0
1
2

附:最终采用的格式:

echo ${topo} | python -c "exec(\"import sys, json\nfor i in json.load(sys.stdin)['${tsc}']['slave']:\n    print(i)\")"`)

bingo!

 

标签:脚本,python,单行,json,import,print,world,os
From: https://www.cnblogs.com/jkin/p/16823058.html

相关文章

  • Python教程Day12-函数(一)
    函数(一)一、函数的作用​​需求​​:用户到ATM机取钱输入密码后显示"选择功能"界面查询余额后显示"选择功能"界面取2000钱后显示"选择功能"界面特点:显示“选择功能”界面需要......
  • Python教程Day12-函数(二)
    函数(二)一、变量作用域一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量作用域指的是变量生效的范围,主要分为两类:局部变量......
  • python之第三方库netifaces库:netifaces 模块用于提供有关网络接口及其状态的信息(①获
    前言1、 在系统运维等过程中,网络永远是离不开的话题。网络中比较基础的是网络接口,每个网络接口都有一个名字,并且有它的ip地址,还有关于从这个接口出去的包的路由。我们可......
  • Python学习记录(六):关键字
    打印Python语言的关键字,我们代码中的变量不能与内置的关键字相同>>>importkeyword>>>print(keyword.kwlist)['False','None','True','__peg_parser__','and','a......
  • ModuleNotFoundError: No module named 'cv2' in Python
    ModuleNotFoundError:Nomodulenamed'cv2'inPythonModuleNotFoundError:Nomodulenamed'cv2'inPythonsudopip3installopencv-pythonpip3installopencv-p......
  • python做了个自动关机工具,再也不会耽误我下班啦
    上班族经常会遇到这样情况,着急下班结果将关机误点成重启,或者临近下班又通知开会,开完会已经迟了还要去给电脑关机。【阅读全文】今天使用PyQt5做了个自动关机的小工具,设置......
  • python字符串操作方法
    1、格式化1)%号#1、格式的字符串(即%s)与被格式化的字符串(即传入的值)必须按照位置一一对应#当需格式化的字符串过多时,位置极容易搞混print('%sasked%stodosomethin......
  • Python - Locust对接口进行压测
    我们在做性能测试主要去看的就是以上四点:错误率,响应时间,tps和rps当我们使用Python去构建自动化测试框架时,我们用Locust来对接口进行压测,具体写法如下:首先我们需要在cmd中......
  • Python 函数
     目录导航1.一个简单的函数2.文档字符串3.向函数传递信息4.参数默认值5.返回简单值6.返回字典7.传递列表8.在函数中修改列表......
  • Windows 脚本放到 Linux 服务器不生效的问题 /bin/bash^M: bad interpreter: No suc
    在windows编辑shell脚本后,由于文件格式原因,在linux下运行报错有三个方法1.在windows下,使用notepad++,将文件格式改为unix就可以了2.在linux下,使用vim打开文件,使用:setff......