話題の記事を期間・はてブ数・カテゴリなどから検索できるWebサービスです。
話題の記事を期間・はてブ数・カテゴリなどから検索できるWebサービスです。
H(uman-friendly) な grep コマンド hgrep をつくりました. github.com '\w+ で検索した時の出力 ファイルを特定のパターンで検索し,マッチした箇所を構文ハイライトしたコード片で表示します.超ざっくり言うと,ripgrep で検索して bat でマッチ箇所付近を表示するような感じです. grep -C によるコンテキスト表示に似ていますが,マッチ行が近い時は1つのコード片にまとめる,周囲何行を表示するかをヒューリスティックに少し賢く決めているなど,ちょっと出力は工夫しています. 動機 手元のリポジトリでコードを検索する時は 単純に grep で検索してマッチ結果を眺める grep | fzf のように検索結果を fzf で絞り込んだりプレビューする vim $(grep -l ...) のように検索結果をエディタで開く あたりを使い分けているのですが
去年も『本番環境でやらかしちゃった人のアドベントカレンダー』は盛り上がりましたね。 知見が多く、関心しながら拝見しています。 人は必ず何かしらミスを起こすもの。 明日は我が身と思いながら、業務をこなす日々です。 そんな私も業界に入って1年目(前々職)に、本番環境の洗礼にあったことがございます。 当時は苦々しい思いをしましたが、その経験を供養するためにもここに残そうと思います。 発生当時の状況 事件当時、私はサーバのリプレイス案件にアサインしていました。 その業務の中で上司に日常的に運用されているスクリプトの調査を依頼されました。 私はまだ経験が浅かったため理解が合っているかは怪しいですが、関わっていたシステムは設計の段階で大分やっつけだったらしく、 格納場所が間違っているスクリプトやログが散見されました。 リプレイスを切っ掛けに整理をする予定だったと記憶しています。 入ったばかりのペーペー
Linuxのコマンドラインで文字列を検索する際に必要不可欠なコマンドといえば「grep」です。しかし、grepは動画ファイルやPDFファイルの文字列を検索できないのが弱点。そんなgrepの弱点を克服し、動画ファイルのメタデータやデータベースのレコード、画像ファイル内の文字列まで検索可能なコマンドが「ripgrep-all(rga)」です。 GitHub - phiresky/ripgrep-all: rga: ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc. https://github.com/phiresky/ripgrep-all rgaはLinuxに限らずWindowsやmacOSでも利用することが可能。今回はUbuntu 20.04でrgaを利用してみます。以下のコマンドを
filtというツールを作りました github.com これはなに まずは以下のスクリーンキャストをご覧ください tail -F /path/to/access.log のようなログの流れを止めてはgrepをして、止めてはgrepのコマンドを変更してしています。 その間、実は裏では実際のストリームは止めていません。 つまり、ストリームのパイプ先に まずfiltを指定しておく ことで、ストリーム自体は止めずに、パイプ先のコマンドを 後で何度でも 変更できます。 grepやsedやawkが下手なので何度も試行したい 私はgrepやsedやawkなどのコマンドを一発で指定できるほど練度が高くないので、コマンドを組み立てるために何度も Ctrl+C でキャンセルしては再実行の繰り返しをしていました。 最近は stern や Harvest などでKubernetesのPodのログを流すことをもある
こんにちは、 ast-grepの作者Herringtonです。 正規表現でコードを検索したことがある方なら、複数行のマッチングや入れ子構造の処理、コメントの無視などに苦労したことがあるかもしれません。 そこで、ast-grep VSCodeという新しい拡張を紹介します。これは、構造的検索と置換(SSR)という技術を利用して、より正確で効率的な検索と置換を実現するツールです。 構造検索は? テキスト検索と置換の限界 例えば、JavaScriptコードをリファクタリングして、lodash の _.filter 関数をネイティブの Array.prototype.filter メソッド に置き換えたいとします。単純なテキスト検索と置換は次のようになります: これは一部のケースではうまくいくかもしれませんが、いくつかの問題があります。 一行の式しかマッチングできません。コードが複数行にまたがってい
Search across a half million git repos. Search by regular expression.
特定の文字列がある行から、別の特定の文字列がある行までを抽出したいということがよくあります。 これgrep等を使うと苦労する話なんですが、flip-flop演算子を使ったPerlのone-linerで可能です。 例えば昨日の記事ではgit help commitの中から--no-edit/オプションの説明を抽出しました。 これは--no-editという文字列が出てくるところから空行までを抽出すれば良い。これは以下のようにすれば可能です。 $ git help commit | perl -nle 'print if /--no-edit/ ... /^\s*$/' 解説自体に空行が混じるケースでは以下のようにすれば良いでしょう。 この例では、--cleanupという文字列が出現してから、次のオプション(-文字列形式)が出るまでを抽出しています。 $ git help commit | pe
大きなコードベースを持ったプロジェクトでコードを書くとなった時に、書くのと同じくらい(またはそれ以上に)コードを読むことになると思います。 なので、コードの検索ツールの良し悪しは生産性に直接的に影響してくると言えるでしょう。 VSCode へのお気持ち 僕は普段はIntelliJを使っていて、その検索ツールの出来(もちろんそれ以外も)に非常に満足していますが、諸々の事情からVSCodeを使いたいという気持ちになることが多々あります。 しかし、どうしてもVSCodeの検索ツールが好きになれず移行する気持ちになれないでいました。 具体的に何が好きになれないかと言うと、Open in Editorを使用しない場合は、検索結果の周辺コードのプレビューを見るためにファイルをポコポコ開いていく必要がありツライです。Open in Editorを使用する場合は、周辺コードの情報量の調整が面倒でツライです
Gitリポジトリ内を検索する機会はよくあると思います。git grepコマンドを使えば、git管理下のファイルのみを対象としてgrepができます。シンプルなコマンドですが、利便性はとても高いと思います。 「このメソッドって、どこで使われてるんだっけ?」 「その定数の定義って、値は何だっけ? どこにあるんだっけ?」 「あのURLって、何箇所で使われているんだろう?」 Gitリポジトリ内を検索する機会はよくあると思います。 このメソッドって、どこで使われてるんだっけ? その定数の定義って、値は何だっけ? どこにあるんだっけ? あのURLって、何箇所で使われているんだろう? git grepコマンドを使えば、Git管理下のファイルのみを対象としてgrepができます。 シンプルなコマンドですが、利便性はとても高いと思います。 なお、grep対象はカレントブランチのみです。 目次 シンプルな例 特定
経緯 ごく稀に、プロダクト内に書かれた文言の修正をすることってありますよね。 htmlやテンプレートファイルに文字列が記載されていれば、普通にgrepするなり、sedで一括置換できたりします。 問題は画像です・・・! 画像の中に置き換えなければいけない文字があることもあると思いますが、画像を目視で見ないと分からないですよね。 過去の経験的にも、あとから置き換えなければいけない文字を含む画像が見つかって、修正する・・・みたいなことを何度か経験したことがあります。 (本来は、画像内にあまり文字を書くのは良くないと思うのだけど・・・説明ページとかだと仕方ない場合もありますよね。) 画像内をgrepできたらいいのに、と思ったのでOCRを活用して画像内の文字列をテキスト化し、その中に調べたい文字列があるかをチェックするツールを作ってみたので紹介します。 OCRとは OCR(Optical Chara
grep.app https://grep.app/ 「grep.app」は、正規表現を使ってGitHubリポジトリを検索できるWebサービスです。 まだローンチしたてということで、検索できるリポジトリ数は50万。全体で1億リポジトリを抱えるGitHubにおいてはまさに一部のみであるが、本家GitHubのCTOも注目するサービスとあって話題にのぼっています。 GitHubリポジトリを検索してみる 機能はいたってシンプル。Regular expressionにチェックをつけて、正規表現で検索するだけ ヒットしたリポジトリ結果をみることができます。 例えば、このように通常のAnd検索にしにくい場合であっても、簡単に引くことができます。 Hacker News Jason Warner氏もクールな仕事っぷりを称賛しています。 もし、正規表現で困ったら・・・ 便利な検索ツールも、最大の課題は、正規
ANDPADボードチームの原田(tomtwinkle)です。 前回の記事で結構反響いただけたようで注意喚起記事としては名目は果たせたかなと思います。 tech.andpad.co.jp 個人的には過去にもQiitaの自分のブログにもこんな記事 Gormとの破局、そしてFacebook/entとの出会い - Qiita を書いてるようにGorm自体にはそこまで思い入れはなく、新規にプロダクトを作る際の選択肢で検討しているなら出来ればやめた方が良いと言いたい気持ちが強いのですが……既に採用されているプロダクトなら乗り換えは大変ですよね。 以下はそんな既にGormを利用している皆さんのための内容になります。 これは何? GormのQuery Conditions関数を用いた実装を行った際に脆弱性につながる実装があった場合Pull RequestのReviewで自動的に指摘しようというやつです。
git grep 便利ですよね。 私は git grep と git gsub は本当によく使います。 ところで git grep はローカルリポジトリがないと実行できません。 ローカルにリポジトリがなければ git clone して、 git grep すればいいのですが、もう少し簡単にgrepするために gh-grep を作りました。 github.com gh-grep gh-grepはGitHub APIを使ってGitHub上のリポジトリに対してgrepをするツールです。 特徴は、全てGitHub APIを通じて実行するためローカルに git clone することなくgrepできることです。 また、APIを使っている特徴を活用して複数リポジトリに対してgrepすることなども可能になっています。 あと実行が遅いです。ひたすらGitHub APIを叩いているので...*1。 インストー
これは Andrew Gallant 著 ripgrep is faster than {grep, ag, git grep, ucg, pt, sift} の翻訳です。英語版は UNLICENSE と MIT ライセンスのデュアルライセンスで公開されています。 この翻訳は UNLICENSE の許諾に基づいて公開されます。 この記事では新しいコマンドライン検索ツール ripgrep を紹介する。ripgrep は The Silver Searcher (ack クローン) の利便性と GNU grep の高い性能を併せ持つ。ripgrep は高速で、クロスプラットフォーム (Linux, Mac, Windows 用のバイナリが利用可能) で、Rust を使って書かれている。 ripgrep は Github で公開されている。 この記事では不可能なことを試みる: いくつかの有名なコ
数多くあるUnixコマンドの中でも、もっとも利用頻度の高いもののひとつがgrepではないでしょうか。設定ファイルやログから該当する箇所を調べたり、ソースコードを検索したり、あるいはパイプラインのフィルタとして利用したりと、あらゆる場面で活躍する超基本ツールです。 とはいえgrepは機能がシンプル過ぎるため、もう少し空気を読んだ、賢い検索をしてくれる代替ツールもまた数多く存在します。たとえば本連載287回ではThe Silver Searcher(ag)を紹介しました。 とはいえこれはもう6年も前の記事です。ag以降も、いろいろな検索ツールが登場しています。そこで今回はさらに高速な検索ツールである、ripgrepを紹介します。 ripgrepとは ripgrepとは、公式サイトによると「ripgrep recursively searches directories for a regex
大規模なコードベース向けの高速なASTツールとしてast-grepというものがある。これについての調査メモ。 主に以下の公式ドキュメントを読み進めて、利用方法、パターンやルールの詳細などについて理解を深める。 ast-grepとは 公式ドキュメントでは、コードの検索からLint、codemodに至るまでASTツールとして網羅的にカバーできるツールであることが以下のように表現されている。 Think ast-grep as an hybrid of grep, eslint and codemod. 結果に精度が求められる場面では、高速であるものの精密さに欠けるテキストベースではなく、ASTベースでの正確な解析の方が望ましいだろうけど、ASTでの記述は非常に面倒になりがちという側面がある。 その点においてast-grepは、テキストベースでのgrepではなく、ASTベースでのgrepというよ
また, grep1 には以下のようなオプションがあります。 -v, --invert-match マッチの意味を逆にして、マッチしない行を抜き出して表示します。 -l, --files-with-matches 通常の出力はしません。その代わりに、 grep を普通に実行した際に、何らかの検索結果を表示するような入力ファイルの名前を列挙します (訳注: すなわち、-l オプションを指定すると、 -v オプションを同時に指定しない場合は、パターンにマッチする文字列を含む行が存在するファイルの名前を列挙するということです)。 個々のファイルに対する走査は、最初のマッチで終了します。 -r, --recursive 各ディレクトリの下にあるすべてのファイルを再帰的に読み込みます。 ただし、シンボリックリンクはコマンドラインで指定されたときにのみたどります。 検索対象のファイルが指定されなかった場
はじめに: 弊社のとあるEDI(電子商取引)関連のプロダクトでは、Ruby on Railsを利用してGraphQL APIを提供しています。 その開発活動の中で最近、コードの品質と整合性を維持するためのツールとして rubocop-grep を利用し始めました。 この記事ではその具体的な活用事例についてお話しします。 目次 rubocop-grepとは 最初のユースケースと、基本的な使い方の説明 複数のルールをディレクトリごとに設定するための工夫 ほかにどのようなユースケースがありそうか まとめ rubocop-grepとは rubocop-grep は、rubocop の拡張ツールです。 プロジェクト独自のコーディングルールを、正規表現を用いて簡単に定義することができます。 この手の問題は、今までもカスタムCopを書くことで解決することはできましたが、カスタムCopはASTの知識やRu
Ugrep is a true drop-in replacement for GNU grep (assuming you copy or symlink ug to grep, egrep and fgrep), unlike many other popular grep claiming to be "grep alternatives" or "replacements" when those actually implement incompatible command-line options and use a different, incompatible regex matcher i.e. Perl regex versus POSIX regex grep (ugrep supports both) Ugrep is fast, user-friendly, and
こんにちは。正規表現でかんたんにCopを書けるRuboCop拡張を作ってみたので紹介します。 github.com 使い方 まず、ほかのRuboCop拡張と同様にgemをインストールし、.rubocop.ymlのrequireにこのgemを指定してください。 この拡張は設定をしないと何も動きません。次のように.rubocop.ymlに設定をします。 Grep/Grep: Rules: # シンプルな例。正規表現にマッチした場合に、このCopが警告をします。 - Pattern: '\bENV\b' Message: Do not refer ENV directly. # パターンはArrayにして複数の正規表現を含めることができます。 - Pattern: - 'binding\.irb' - 'binding\.pry' Message: 'Debug code remains' #
AST-GREPFind Code by Syntax ast-grep(sg) is a fast and polyglot tool for code structural search, lint, rewriting at large scale. Search and Rewriteast-grep is a code tool for structural search and replace. It is like syntax-aware grep/sed! You can write code patterns to locate and modify code, based on AST, in thousands of files, interactively. sg -p '$A && $A()' -r '$A?.()' Scan as Linterast-grep
grep is the ultimate text search tool available on virtually all Linux machines. While there are now better alternatives (such as ripgrep), you will still often find yourself on a server where grep is the only search tool available. So it's nice to have a working knowledge of it. That's why is I've created this interactive step-by-step guide to grep operations. You can read it from start to finish
なんらかの理由で MySQLにクソ重いクエリがたくさん流れてしまった場合、SHOW PROCESSLISTをみて、クエリをKILLするなんてことは、あったりなかったりします。 この時にクエリが数十個となると、手作業ではやりきれませんので、コマンドを駆使して対応することになります。 ちょっと前にやったのが以下のコマンド /usr/bin/mysql --defaults-extra-file=/path/to/.my-other.cnf -NB -e 'SELECT GROUP_CONCAT(ID) FROM \ information_schema.PROCESSLIST WHERE STATE = "Creating sort index" AND TIME > 1000 AND INFO \ LIKE "select%example%"' | grep -v NULL | /usr/b
今年も『本番環境でやらかしちゃった人のアドベントカレンダー』の季節がやってきましたね。 知見が多く、関心しながら拝見しています。 人は必ず何かしらミスを起こすもの。 明日は我が身と思いながら、業務をこなす日々です。 そんな私も業界に入って1年目に、本番環境の洗礼にあったことがございます。 当時は苦々しい思いをしましたが、その経験を供養するためにもここに残そうと思います。 発生当時の状況 事件当時、私はサーバのリプレイス案件にアサインしていました。 その業務の中で上司に日常的に運用されているスクリプトの調査を依頼されました。 私はまだ経験が浅かったため理解が合っているかは怪しいですが、関わっていたシステムは設計の段階で大分やっつけだったらしく、 格納場所が間違っているスクリプトやログが散見されました。 リプレイスを切っ掛けに整理をする予定だったと記憶しています。 入ったばかりのペーペーの私が
ripgrepが圧倒的に速い。こんなに速い理由は大きく2つ。 ripgrepは、検索する必要がなさそうなファイル(たとえば、隠しファイル、バイナリファイル)をデフォルトで無視するようになっている。上記計測に使ったディレクトリを確認したところ、20万ファイル中14万ファイルは無視されるものだった。つまり、ripgrepは実質20万-14万=6万ファイルだけを検索していたのに対し、従来のgrepでは全20万ファイルを律儀に検索していたことになる。 ripgrepは、シンプルに検索のアルゴリズムが優れている。隠しファイル等を無視せず検索するオプションを指定し、検索対象となるファイル数を同じ20万に揃えて計測してみたところ、それでもripgrepは22秒で検索が終わった。 もっと厳密なベンチマークは公式を参照のこと。 https://blog.burntsushi.net/ripgrep/ デフォ
まずは結論から SpringのDIコンテナに管理してもらいたいクラスが、自分で作成しているクラスなのか、それとも外部のライブラリ(サードパーティのライブラリ)のクラスなのかによって、@Componentを使うか@Beanを使うか変わる。 @Componentとは @Compnentは、Spring BootでWebのMVCアプリを作成するときに使用する@Controller, @Service, @Repositoryと同様に、SpringのDIコンテナに管理させて@AutowireなどでDIできるようにしたいクラスにつける。 @Controller等はMVCの文脈上で特化したクラスにつけられるのに対して、@Componentはそれら以外の特化していないクラス全般に付与するだけで、基本的には同じ。 @Beanとは @Beanも同様にSpringのDIコンテナに管理させたいものにつける点は同
はじめに こんにちは、ast-grepの作者ヘリントンです。 Reactバージョン19のリリースに伴い、新機能と改善が追加されました。 しかし、この新バージョンへのアップグレードには、ソースコードの一部を修正する必要があります。特に大規模なコードベースでは、このプロセスはかなり手間がかかり、繰り返し行う必要があります。 本記事では、ast-grepというツールの使用方法を説明します。このツールは、コードベース内でパターンを見つけて置き換えることを目的として設計されており、React 19への移行を容易にします。 以下の3つの主要なcodemodsに焦点を当てます。 <Context>をプロバイダとして使用する 暗黙のrefコールバックリターンを削除する refをpropsとして使用し、forwardRefを削除する 前提条件: ast-grepのセットアップ まず、ast-grepをセット
これはゲームボーイの起動時に、カセットがきれいに差さっていないとよく表示されるバグったロゴ。 ゲームボーイ世代の方にはお馴染みの現象です。 参考動画: https://www.youtube.com/watch?v=tc3vYosDTRo (こちらはソフトを差していないようで、ロゴが真っ黒になっています)私自身懐かしいなと思ったのですが、ふと疑問に思うことがありました。 なぜ、このようなバグったロゴを表示する機能があるのだろう? ゲームボーイより前に発売されたファミリーコンピューターでは、このような機能はなく、カセットが上手く差さっていないとゲームがそもそも起動しません。 上手く差さっていないことを遊ぶ人に伝えるだけであれば、わざわざバグったロゴを表示しなくとも、それが分かる表示をすれば済む話です。 前述のツイートのように、多種多様なバグったロゴは必要ないはずです。 「これは何か理由がある
sedコマンド sed(Stream Editor)は、テキストストリームの編集に特化した強力なツールです。以下にsedコマンドの基本的な構文を示します。 オプション: sedコマンドの挙動を制御するための指定です。例えば、置換を行う場合には-eオプションを使用します。 スクリプト: 実行したいsedコマンドの操作を指定します。置換や削除、追加など、様々な編集操作が可能です。 ファイル名: 処理を行いたいテキストファイルのパスを指定します。省略した場合は標準入力から読み込みます。 以下でもう少し詳しく解説します。 コマンド どういう処理をしたいかをコマンドで指定します。 処理内容の出力、削除、文字列の追加、置換などの処理を行えるコマンドが用意されています。 コマンド説明
(正規表現)のように正規表現を()で括ると、マッチした値を参照できるようになる。捕捉グループ、capturing groupと呼ばれ、大体のプログラミング言語の正規表現ライブラリで対応している。 sedだと、\1, \2, ... という記法で後方参照できる。 Rubyだと、正規表現内では \1, \2, ... という記法で後方参照でき、マッチ処理が終わったあとであれば$1, $2, ... という特殊変数によって n 番目の括弧にマッチした文字列を参照できる。 Javaだと、String#replaceAllで置換するなど $1, $2, ... という記法で後方参照でき、Matcherでマッチ処理をする場合はマッチ処理が終わったあとにMatcher#group(int n)で n 番目の括弧にマッチした文字列を参照できる。 Awkでは以下のようにマッチした値を参照する。 awk 'm
作りました。 Go製です。 何で作ったのか、どういう機能があるのか簡単に紹介します。 これまでの課題 sedやgrepには以下の問題があります。 正規表現の記法がPerl互換ではなく、使いにくい sedはmacとLinuxで互換性がなく(BSDとGNUで互換性がない)、OS依存のコードになりやすい これまでその問題を避けるために私はPerlのワンライナーを利用してきました。Perlは正規表現が使いやすく、柔軟な指定もできます。OS依存にもなりにくいです。しかしPerlには以下の問題がありました。 最近のmacやLinuxにはデフォルトでinstallされていないので使いにくい 特にDockerのようなコンテナ環境は顕著 最近は利用例が減っているので敬遠されがち ワンライナー専用ツールではないのでオプション名がわかりにくい そこで以下のツールを求められていると思います。 Perl互換の使いや
最後に改行がある場合は以下の通り問題ない。 $ printf 'test\ntest\n' test test $ printf 'test\ntest\n' | wc -l 2 wc -lは改行の数を数えるため、最後に改行がないと本当の行数より1少ない数を返してしまう。 $ printf 'test\ntest' test test$ $ printf 'test\ntest' | wc -l 1 対策としては、grep -c ''で空文字に合致する行数を求めることで代用したり、awkのENDとNRを活用したり、sedの現在の行数を出力する=と最終行$を活用したりする方法がある。 $ printf 'test\ntest' | grep -c '' 2 $ printf 'test\ntest' | awk 'END{print NR}' 2 $ printf 'test\ntest'
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く